Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygeninternettoolbar.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 /* 00022 Implements a class that knows how to hold and manage the menu band, brand band, 00023 toolbar, and address band for an explorer window 00024 */ 00025 #include "precomp.h" 00026 00027 // navigation controls and menubar just send a message to parent window 00028 /* 00029 TODO: 00030 ****Implement BandProxy methods 00031 ****Add QueryStatus handler for built-in bands 00032 ****Enable/Disable up, search, and folders commands appropriately 00033 **Why are explorer toolbar separators a nonstandard width? 00034 **Remove "(Empty)" item from Favorites menu. Probably something missing in CMenuCallback::CallbackSM 00035 **Chevron menu on menuband doesn't work 00036 **Fix CInternetToolbar::QueryBand to be generic 00037 00038 ****Fix context menu to strip divider when menu shown for menu band 00039 ****Fix context menu to have items checked appropriately 00040 ****Implement -1 command id update 00041 ****When bands are rearranged, resize the internet toolbar and fix height of brand band 00042 ****Right clicking on the browse back and forward toolbar buttons displays the same as pulldown menus 00043 Implement show/hide of bands 00044 Why is the background color of my toolbars different from explorer? 00045 Internet Toolbar command handler should get the target for the command and call Exec on the target. 00046 For commands built in to the Internet Toolbar, its Exec handles the command 00047 When window width is changed, brand band flashes badly 00048 Add all bands with correct ids (system bands now add with correct ids) 00049 Implement IBandSite 00050 Implement remaining IExplorerToolbar methods 00051 Fix toolbar buttons to enable/disable correctly 00052 After toolbar is customized, it may be necessary to patch the widths of separators 00053 Add theme support 00054 Check sizes and spacing of toolbars against Explorer 00055 Implement resizing of the dock bar 00056 Add missing icons for toolbar items 00057 Draw History item in forward/back dropdown menus with icon 00058 Fix toolbar customize dialog to not include separators as possible selections 00059 Implement save/restore of toolbar state 00060 Refactor drop down menu code to use a common function since code is so similar 00061 */ 00062 00063 extern HRESULT WINAPI SHBindToFolder(LPITEMIDLIST path, IShellFolder **newFolder); 00064 extern HRESULT CreateToolsBar(REFIID riid, void **ppv); 00065 extern HRESULT CreateBrandBand(REFIID riid, void **ppv); 00066 extern HRESULT CreateBandProxy(REFIID riid, void **ppv); 00067 extern HRESULT CreateAddressBand(REFIID riid, void **ppv); 00068 00069 class CInternetToolbar; 00070 00071 class CDockSite : 00072 public CComObjectRootEx<CComMultiThreadModelNoCS>, 00073 public IDockingWindowSite, 00074 public IInputObjectSite, 00075 public IOleCommandTarget, 00076 public IServiceProvider 00077 { 00078 public: 00079 enum { 00080 ITF_NOGRIPPER = 1, 00081 ITF_NOTITLE = 2, 00082 ITF_NEWBANDALWAYS = 4, 00083 ITF_GRIPPERALWAYS = 8, 00084 ITF_FIXEDSIZE = 16 00085 }; 00086 private: 00087 CComPtr<IUnknown> fContainedBand; // the band inside us 00088 CInternetToolbar *fToolbar; // our browser 00089 HWND fRebarWindow; 00090 HWND fChildWindow; 00091 int fBandID; 00092 public: 00093 int fFlags; 00094 private: 00095 bool fInitialized; 00096 // fields of DESKBANDINFO must be preserved between calls to GetBandInfo 00097 DESKBANDINFO fDeskBandInfo; 00098 public: 00099 CDockSite(); 00100 ~CDockSite(); 00101 HRESULT Initialize(IUnknown *containedBand, CInternetToolbar *browser, HWND hwnd, int bandID, int flags); 00102 HRESULT GetRBBandInfo(REBARBANDINFOW &bandInfo); 00103 private: 00104 00105 // *** IOleWindow methods *** 00106 virtual HRESULT STDMETHODCALLTYPE GetWindow(HWND *lphwnd); 00107 virtual HRESULT STDMETHODCALLTYPE ContextSensitiveHelp(BOOL fEnterMode); 00108 00109 // *** IDockingWindow methods *** 00110 virtual HRESULT STDMETHODCALLTYPE GetBorderDW(IUnknown* punkObj, LPRECT prcBorder); 00111 virtual HRESULT STDMETHODCALLTYPE RequestBorderSpaceDW(IUnknown* punkObj, LPCBORDERWIDTHS pbw); 00112 virtual HRESULT STDMETHODCALLTYPE SetBorderSpaceDW(IUnknown* punkObj, LPCBORDERWIDTHS pbw); 00113 00114 // *** IInputObjectSite specific methods *** 00115 virtual HRESULT STDMETHODCALLTYPE OnFocusChangeIS(IUnknown *punkObj, BOOL fSetFocus); 00116 00117 // *** IOleCommandTarget specific methods *** 00118 virtual HRESULT STDMETHODCALLTYPE QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[ ], OLECMDTEXT *pCmdText); 00119 virtual HRESULT STDMETHODCALLTYPE Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut); 00120 00121 // *** IServiceProvider methods *** 00122 virtual HRESULT STDMETHODCALLTYPE QueryService(REFGUID guidService, REFIID riid, void **ppvObject); 00123 00124 BEGIN_COM_MAP(CDockSite) 00125 COM_INTERFACE_ENTRY_IID(IID_IOleWindow, IOleWindow) 00126 COM_INTERFACE_ENTRY_IID(IID_IDockingWindowSite, IDockingWindowSite) 00127 COM_INTERFACE_ENTRY_IID(IID_IInputObjectSite, IInputObjectSite) 00128 COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget, IOleCommandTarget) 00129 COM_INTERFACE_ENTRY_IID(IID_IServiceProvider, IServiceProvider) 00130 END_COM_MAP() 00131 }; 00132 00133 CDockSite::CDockSite() 00134 { 00135 fToolbar = NULL; 00136 fRebarWindow = NULL; 00137 fChildWindow = NULL; 00138 fBandID = 0; 00139 fFlags = 0; 00140 fInitialized = false; 00141 memset(&fDeskBandInfo, 0, sizeof(fDeskBandInfo)); 00142 } 00143 00144 CDockSite::~CDockSite() 00145 { 00146 } 00147 00148 HRESULT CDockSite::Initialize(IUnknown *containedBand, CInternetToolbar *browser, HWND hwnd, int bandID, int flags) 00149 { 00150 CComPtr<IObjectWithSite> site; 00151 CComPtr<IOleWindow> oleWindow; 00152 CComPtr<IDeskBand> deskBand; 00153 TCHAR textBuffer[40]; 00154 REBARBANDINFOW bandInfo; 00155 HRESULT hResult; 00156 00157 hResult = containedBand->QueryInterface(IID_IObjectWithSite, (void **)&site); 00158 if (FAILED(hResult)) 00159 return hResult; 00160 hResult = containedBand->QueryInterface(IID_IOleWindow, (void **)&oleWindow); 00161 if (FAILED(hResult)) 00162 return hResult; 00163 hResult = containedBand->QueryInterface(IID_IDeskBand, (void **)&deskBand); 00164 if (FAILED(hResult)) 00165 return hResult; 00166 fContainedBand = containedBand; 00167 fToolbar = browser; 00168 fRebarWindow = hwnd; 00169 fBandID = bandID; 00170 fFlags = flags; 00171 hResult = site->SetSite((IOleWindow *)this); 00172 if (FAILED(hResult)) 00173 return hResult; 00174 hResult = oleWindow->GetWindow(&fChildWindow); 00175 if (FAILED(hResult)) 00176 return hResult; 00177 00178 memset(&bandInfo, 0, sizeof(bandInfo)); 00179 bandInfo.cbSize = sizeof(bandInfo); 00180 bandInfo.lpText = textBuffer; 00181 bandInfo.cch = sizeof(textBuffer) / sizeof(TCHAR); 00182 hResult = GetRBBandInfo(bandInfo); 00183 00184 SendMessage(fRebarWindow, RB_GETBANDCOUNT, 0, 0); 00185 SendMessage(fRebarWindow, RB_INSERTBANDW, -1, (LPARAM)&bandInfo); 00186 fInitialized = true; 00187 return S_OK; 00188 } 00189 00190 HRESULT CDockSite::GetRBBandInfo(REBARBANDINFOW &bandInfo) 00191 { 00192 CComPtr<IDeskBand> deskBand; 00193 HRESULT hResult; 00194 00195 hResult = fContainedBand->QueryInterface(IID_IDeskBand, (void **)&deskBand); 00196 if (FAILED(hResult)) 00197 return hResult; 00198 00199 fDeskBandInfo.dwMask = DBIM_BKCOLOR | DBIM_MODEFLAGS | DBIM_TITLE | DBIM_ACTUAL | DBIM_INTEGRAL | DBIM_MAXSIZE | DBIM_MINSIZE; 00200 hResult = deskBand->GetBandInfo(fBandID, 0, &fDeskBandInfo); 00201 // result of call is ignored 00202 00203 bandInfo.fMask = RBBIM_LPARAM | RBBIM_IDEALSIZE | RBBIM_ID | RBBIM_CHILDSIZE | RBBIM_CHILD | RBBIM_TEXT | RBBIM_STYLE; 00204 00205 bandInfo.fStyle = RBBS_FIXEDBMP; 00206 if (fDeskBandInfo.dwModeFlags & DBIMF_VARIABLEHEIGHT) 00207 bandInfo.fStyle |= RBBS_VARIABLEHEIGHT; 00208 if (fDeskBandInfo.dwModeFlags & DBIMF_USECHEVRON) 00209 bandInfo.fStyle |= RBBS_USECHEVRON; 00210 if (fDeskBandInfo.dwModeFlags & DBIMF_BREAK) 00211 bandInfo.fStyle |= RBBS_BREAK; 00212 if (fDeskBandInfo.dwModeFlags & DBIMF_TOPALIGN) 00213 bandInfo.fStyle |= RBBS_TOPALIGN; 00214 if (fFlags & ITF_NOGRIPPER || fToolbar->fLocked == true) 00215 bandInfo.fStyle |= RBBS_NOGRIPPER; 00216 if (fFlags & ITF_NOTITLE) 00217 bandInfo.fStyle |= RBBS_HIDETITLE; 00218 if (fFlags & ITF_GRIPPERALWAYS && fToolbar->fLocked == false) 00219 bandInfo.fStyle |= RBBS_GRIPPERALWAYS; 00220 if (fFlags & ITF_FIXEDSIZE) 00221 bandInfo.fStyle |= RBBS_FIXEDSIZE; 00222 00223 if (fDeskBandInfo.dwModeFlags & DBIMF_BKCOLOR) 00224 { 00225 bandInfo.fMask |= RBBIM_COLORS; 00226 bandInfo.clrFore = CLR_DEFAULT; 00227 bandInfo.clrBack = fDeskBandInfo.crBkgnd; 00228 } 00229 wcsncpy(bandInfo.lpText, fDeskBandInfo.wszTitle, bandInfo.cch); 00230 bandInfo.hwndChild = fChildWindow; 00231 bandInfo.cxMinChild = fDeskBandInfo.ptMinSize.x; 00232 bandInfo.cyMinChild = fDeskBandInfo.ptMinSize.y; 00233 bandInfo.wID = fBandID; 00234 bandInfo.cyChild = fDeskBandInfo.ptActual.y; 00235 bandInfo.cyMaxChild = fDeskBandInfo.ptMaxSize.y; 00236 bandInfo.cyIntegral = fDeskBandInfo.ptIntegral.y; 00237 bandInfo.cxIdeal = fDeskBandInfo.ptActual.x; 00238 bandInfo.lParam = (LPARAM)this; 00239 return S_OK; 00240 } 00241 00242 HRESULT STDMETHODCALLTYPE CDockSite::GetWindow(HWND *lphwnd) 00243 { 00244 if (lphwnd == NULL) 00245 return E_POINTER; 00246 *lphwnd = fRebarWindow; 00247 return S_OK; 00248 } 00249 00250 HRESULT STDMETHODCALLTYPE CDockSite::ContextSensitiveHelp(BOOL fEnterMode) 00251 { 00252 return E_NOTIMPL; 00253 } 00254 00255 HRESULT STDMETHODCALLTYPE CDockSite::GetBorderDW(IUnknown* punkObj, LPRECT prcBorder) 00256 { 00257 return E_NOTIMPL; 00258 } 00259 00260 HRESULT STDMETHODCALLTYPE CDockSite::RequestBorderSpaceDW(IUnknown* punkObj, LPCBORDERWIDTHS pbw) 00261 { 00262 return E_NOTIMPL; 00263 } 00264 00265 HRESULT STDMETHODCALLTYPE CDockSite::SetBorderSpaceDW(IUnknown* punkObj, LPCBORDERWIDTHS pbw) 00266 { 00267 return E_NOTIMPL; 00268 } 00269 00270 HRESULT STDMETHODCALLTYPE CDockSite::OnFocusChangeIS (IUnknown *punkObj, BOOL fSetFocus) 00271 { 00272 return E_NOTIMPL; 00273 } 00274 00275 HRESULT STDMETHODCALLTYPE CDockSite::QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[ ], OLECMDTEXT *pCmdText) 00276 { 00277 return E_NOTIMPL; 00278 } 00279 00280 HRESULT STDMETHODCALLTYPE CDockSite::Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut) 00281 { 00282 TCHAR textBuffer[40]; 00283 REBARBANDINFOW bandInfo; 00284 int index; 00285 HRESULT hResult; 00286 00287 if (IsEqualIID(*pguidCmdGroup, CGID_DeskBand)) 00288 { 00289 switch (nCmdID) 00290 { 00291 case DBID_BANDINFOCHANGED: 00292 if (fInitialized == false) 00293 return S_OK; 00294 if (V_VT(pvaIn) != VT_I4) 00295 return E_INVALIDARG; 00296 if (V_I4(pvaIn) != fBandID) 00297 return E_FAIL; 00298 // deskband information changed 00299 // call GetBandInfo and refresh information in rebar 00300 memset(&bandInfo, 0, sizeof(bandInfo)); 00301 bandInfo.cbSize = sizeof(bandInfo); 00302 bandInfo.lpText = textBuffer; 00303 bandInfo.cch = sizeof(textBuffer) / sizeof(TCHAR); 00304 hResult = GetRBBandInfo(bandInfo); 00305 if (FAILED(hResult)) 00306 return hResult; 00307 index = (int)SendMessage(fRebarWindow, RB_IDTOINDEX, fBandID, 0); 00308 SendMessage(fRebarWindow, RB_SETBANDINFOW, index, (LPARAM)&bandInfo); 00309 return S_OK; 00310 } 00311 } 00312 return E_FAIL; 00313 } 00314 00315 HRESULT STDMETHODCALLTYPE CDockSite::QueryService(REFGUID guidService, REFIID riid, void **ppvObject) 00316 { 00317 CComPtr<IServiceProvider> serviceProvider; 00318 HRESULT hResult; 00319 00320 if (IsEqualIID(guidService, SID_SMenuBandParent)) 00321 return this->QueryInterface(riid, ppvObject); 00322 hResult = fToolbar->QueryInterface(IID_IServiceProvider, (void **)&serviceProvider); 00323 if (FAILED (hResult)) 00324 return hResult; 00325 return serviceProvider->QueryService(guidService, riid, ppvObject); 00326 } 00327 00328 CMenuCallback::CMenuCallback() 00329 { 00330 } 00331 00332 CMenuCallback::~CMenuCallback() 00333 { 00334 } 00335 00336 HRESULT STDMETHODCALLTYPE CMenuCallback::GetObject(LPSMDATA psmd, REFIID riid, void **ppvObject) 00337 { 00338 CComPtr<IShellMenu> parentMenu; 00339 CComPtr<IShellMenu> newMenu; 00340 CComPtr<IShellFolder> favoritesFolder; 00341 LPITEMIDLIST favoritesPIDL; 00342 HWND ownerWindow; 00343 HMENU parentHMenu; 00344 HMENU favoritesHMenu; 00345 HKEY orderRegKey; 00346 DWORD disposition; 00347 HRESULT hResult; 00348 00349 if (!IsEqualIID(riid, IID_IShellMenu)) 00350 return E_FAIL; 00351 if (psmd->uId != FCIDM_MENU_FAVORITES) 00352 return E_FAIL; 00353 if (fFavoritesMenu.p == NULL) 00354 { 00355 hResult = psmd->punk->QueryInterface(IID_IShellMenu, (void **)&parentMenu); 00356 if (FAILED(hResult)) 00357 return hResult; 00358 hResult = parentMenu->GetMenu(&parentHMenu, &ownerWindow, NULL); 00359 if (FAILED(hResult)) 00360 return hResult; 00361 favoritesHMenu = GetSubMenu(parentHMenu, 3); 00362 if (favoritesHMenu == NULL) 00363 return E_FAIL; 00364 hResult = CoCreateInstance(CLSID_MenuBand, NULL, CLSCTX_INPROC_SERVER, IID_IShellMenu, (void **)&newMenu); 00365 if (FAILED(hResult)) 00366 return hResult; 00367 hResult = newMenu->Initialize(this, FCIDM_MENU_FAVORITES, -1, SMINIT_VERTICAL | SMINIT_CACHED); 00368 if (FAILED(hResult)) 00369 return hResult; 00370 hResult = newMenu->SetMenu(favoritesHMenu, ownerWindow, SMSET_TOP | SMSET_DONTOWN); 00371 if (FAILED(hResult)) 00372 return hResult; 00373 hResult = SHGetSpecialFolderLocation(NULL, CSIDL_FAVORITES, &favoritesPIDL); 00374 if (FAILED(hResult)) 00375 return hResult; 00376 hResult = SHBindToFolder(favoritesPIDL, &favoritesFolder); 00377 if (FAILED(hResult)) 00378 return hResult; 00379 RegCreateKeyEx(HKEY_CURRENT_USER, _T("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MenuOrder\\Favorites"), 00380 0, NULL, 0, KEY_READ | KEY_WRITE, NULL, &orderRegKey, &disposition); 00381 hResult = newMenu->SetShellFolder(favoritesFolder, favoritesPIDL, orderRegKey, SMSET_BOTTOM | 0x18); 00382 ILFree(favoritesPIDL); 00383 if (SUCCEEDED(hResult)) 00384 fFavoritesMenu.Attach(newMenu.Detach()); 00385 } 00386 if (fFavoritesMenu.p == NULL) 00387 return E_FAIL; 00388 return fFavoritesMenu->QueryInterface(riid, ppvObject); 00389 } 00390 00391 HRESULT STDMETHODCALLTYPE CMenuCallback::CallbackSM(LPSMDATA psmd, UINT uMsg, WPARAM wParam, LPARAM lParam) 00392 { 00393 switch (uMsg) 00394 { 00395 case SMC_INITMENU: 00396 break; 00397 case SMC_CREATE: 00398 break; 00399 case SMC_EXITMENU: 00400 break; 00401 case SMC_GETINFO: 00402 { 00403 SMINFO *infoPtr = (SMINFO *)lParam; 00404 if ((infoPtr->dwMask & SMIM_FLAGS) != 0) 00405 { 00406 if (psmd->uId == FCIDM_MENU_FAVORITES) 00407 { 00408 infoPtr->dwFlags |= SMIF_DROPCASCADE; 00409 } 00410 else 00411 { 00412 infoPtr->dwFlags |= SMIF_TRACKPOPUP; 00413 } 00414 } 00415 if ((infoPtr->dwMask & SMIM_ICON) != 0) 00416 infoPtr->iIcon = -1; 00417 } 00418 return S_OK; 00419 case SMC_GETSFINFO: 00420 break; 00421 case SMC_GETOBJECT: 00422 return GetObject(psmd, *(IID *)wParam, (void **)lParam); 00423 case SMC_GETSFOBJECT: 00424 break; 00425 case SMC_SFEXEC: 00426 break; 00427 case SMC_SFSELECTITEM: 00428 break; 00429 case 13: 00430 // return tooltip 00431 break; 00432 case SMC_REFRESH: 00433 break; 00434 case SMC_DEMOTE: 00435 break; 00436 case SMC_PROMOTE: 00437 break; 00438 case 0x13: 00439 break; 00440 case SMC_DEFAULTICON: 00441 break; 00442 case SMC_NEWITEM: 00443 break; 00444 case SMC_CHEVRONEXPAND: 00445 break; 00446 case SMC_DISPLAYCHEVRONTIP: 00447 break; 00448 case SMC_SETSFOBJECT: 00449 break; 00450 case SMC_SHCHANGENOTIFY: 00451 break; 00452 case SMC_CHEVRONGETTIP: 00453 break; 00454 case SMC_SFDDRESTRICTED: 00455 break; 00456 case 0x35: 00457 break; 00458 case 49: 00459 break; 00460 case 0x10000000: 00461 break; 00462 } 00463 return S_FALSE; 00464 } 00465 00466 CInternetToolbar::CInternetToolbar() 00467 { 00468 fMainReBar = NULL; 00469 fLocked = false; 00470 fMenuBandWindow = NULL; 00471 fNavigationWindow = NULL; 00472 fMenuCallback.AddRef(); 00473 fToolbarWindow = NULL; 00474 fAdviseCookie = 0; 00475 } 00476 00477 CInternetToolbar::~CInternetToolbar() 00478 { 00479 fMenuCallback.Release(); 00480 } 00481 00482 void CInternetToolbar::AddDockItem(IUnknown *newItem, int bandID, int flags) 00483 { 00484 CDockSite *newSite; 00485 00486 newSite = new CComObject<CDockSite>; 00487 newSite->AddRef(); 00488 newSite->Initialize(newItem, this, fMainReBar, bandID, flags); 00489 } 00490 00491 HRESULT CInternetToolbar::ReserveBorderSpace() 00492 { 00493 CComPtr<IDockingWindowSite> dockingWindowSite; 00494 RECT availableBorderSpace; 00495 RECT neededBorderSpace; 00496 HRESULT hResult; 00497 00498 hResult = fSite->QueryInterface(IID_IDockingWindowSite, (void **)&dockingWindowSite); 00499 if (FAILED(hResult)) 00500 return hResult; 00501 hResult = dockingWindowSite->GetBorderDW((IDockingWindow *)this, &availableBorderSpace); 00502 if (FAILED(hResult)) 00503 return hResult; 00504 SendMessage(fMainReBar, RB_SIZETORECT, RBSTR_CHANGERECT, (LPARAM)&availableBorderSpace); 00505 neededBorderSpace.left = 0; 00506 neededBorderSpace.top = availableBorderSpace.bottom - availableBorderSpace.top; 00507 if (fLocked == false) 00508 neededBorderSpace.top += 3; 00509 neededBorderSpace.right = 0; 00510 neededBorderSpace.bottom = 0; 00511 hResult = dockingWindowSite->SetBorderSpaceDW((IDockingWindow *)this, &neededBorderSpace); 00512 if (FAILED(hResult)) 00513 return hResult; 00514 return S_OK; 00515 } 00516 00517 HRESULT CInternetToolbar::CreateMenuBar(IShellMenu **menuBar) 00518 { 00519 CComPtr<IOleCommandTarget> siteCommandTarget; 00520 CComPtr<IOleWindow> oleWindow; 00521 CComPtr<IOleCommandTarget> commandTarget; 00522 CComPtr<IShellMenuCallback> callback; 00523 VARIANT menuOut; 00524 HWND ownerWindow; 00525 HRESULT hResult; 00526 00527 hResult = CoCreateInstance(CLSID_MenuBand, NULL, CLSCTX_INPROC_SERVER, IID_IShellMenu, (void **)menuBar); 00528 if (FAILED(hResult)) 00529 return hResult; 00530 hResult = fMenuCallback.QueryInterface(IID_IShellMenuCallback, (void **)&callback); 00531 if (FAILED(hResult)) 00532 return hResult; 00533 hResult = (*menuBar)->Initialize(callback, -1, ANCESTORDEFAULT, SMINIT_HORIZONTAL | SMINIT_TOPLEVEL); 00534 if (FAILED(hResult)) 00535 return hResult; 00536 hResult = fSite->QueryInterface(IID_IOleWindow, (void **)&oleWindow); 00537 if (FAILED(hResult)) 00538 return hResult; 00539 hResult = oleWindow->GetWindow(&ownerWindow); 00540 if (FAILED(hResult)) 00541 return hResult; 00542 hResult = fSite->QueryInterface(IID_IOleCommandTarget, (void **)&siteCommandTarget); 00543 if (FAILED(hResult)) 00544 return hResult; 00545 hResult = siteCommandTarget->Exec(&CGID_Explorer, 0x35, 0, NULL, &menuOut); 00546 if (FAILED(hResult)) 00547 return hResult; 00548 if (V_VT(&menuOut) != VT_INT_PTR || V_INTREF(&menuOut) == NULL) 00549 return E_FAIL; 00550 hResult = (*menuBar)->SetMenu((HMENU)V_INTREF(&menuOut), ownerWindow, SMSET_DONTOWN); 00551 if (FAILED(hResult)) 00552 return hResult; 00553 hResult = (*menuBar)->QueryInterface(IID_IOleCommandTarget, (void **)&commandTarget); 00554 if (FAILED(hResult)) 00555 return hResult; 00556 hResult = commandTarget->Exec(&CGID_MenuBand, 3, 1, NULL, NULL); 00557 if (FAILED(hResult)) 00558 return hResult; 00559 return S_OK; 00560 } 00561 00562 HRESULT CInternetToolbar::CreateBrandBand(IUnknown **logoBar) 00563 { 00564 CComPtr<IUnknown> tempBand; 00565 HRESULT hResult; 00566 00567 #if 1 00568 hResult = ::CreateBrandBand(IID_IUnknown, (void **)logoBar); 00569 #else 00570 hResult = CoCreateInstance(CLSID_BrandBand, NULL, CLSCTX_INPROC_SERVER, IID_IUnknown, (void **)logoBar); 00571 #endif 00572 if (FAILED(hResult)) 00573 return hResult; 00574 return S_OK; 00575 } 00576 00577 HRESULT CInternetToolbar::CreateToolsBar(IUnknown **toolsBar) 00578 { 00579 HRESULT hResult; 00580 00581 hResult = ::CreateToolsBar(IID_IUnknown, (void **)toolsBar); 00582 if (FAILED(hResult)) 00583 return hResult; 00584 return S_OK; 00585 } 00586 00587 HRESULT CInternetToolbar::CreateAddressBand(IUnknown **toolsBar) 00588 { 00589 CComPtr<IAddressBand> addressBand; 00590 HRESULT hResult; 00591 00592 #if 1 00593 hResult = ::CreateAddressBand(IID_IUnknown, (void **)toolsBar); 00594 #else 00595 hResult = CoCreateInstance(CLSID_SH_AddressBand, NULL, CLSCTX_INPROC_SERVER, IID_IUnknown, (void **)toolsBar); 00596 #endif 00597 if (FAILED(hResult)) 00598 return hResult; 00599 hResult = (*toolsBar)->QueryInterface(IID_IAddressBand, (void **)&addressBand); 00600 return S_OK; 00601 } 00602 00603 HRESULT CInternetToolbar::LockUnlockToolbars(bool locked) 00604 { 00605 REBARBANDINFOW rebarBandInfo; 00606 int bandCount; 00607 int x; 00608 CDockSite *dockSite; 00609 HRESULT hResult; 00610 00611 if (locked != fLocked) 00612 { 00613 fLocked = locked; 00614 rebarBandInfo.cbSize = sizeof(rebarBandInfo); 00615 rebarBandInfo.fMask = RBBIM_STYLE | RBBIM_LPARAM; 00616 bandCount = (int)SendMessage(fMainReBar, RB_GETBANDCOUNT, 0, 0); 00617 for (x = 0; x < bandCount; x++) 00618 { 00619 SendMessage(fMainReBar, RB_GETBANDINFOW, x, (LPARAM)&rebarBandInfo); 00620 dockSite = (CDockSite *)rebarBandInfo.lParam; 00621 if (dockSite != NULL) 00622 { 00623 rebarBandInfo.fStyle &= ~(RBBS_NOGRIPPER | RBBS_GRIPPERALWAYS); 00624 if (dockSite->fFlags & CDockSite::ITF_NOGRIPPER || fLocked == true) 00625 rebarBandInfo.fStyle |= RBBS_NOGRIPPER; 00626 if (dockSite->fFlags & CDockSite::ITF_GRIPPERALWAYS && fLocked == false) 00627 rebarBandInfo.fStyle |= RBBS_GRIPPERALWAYS; 00628 SendMessage(fMainReBar, RB_SETBANDINFOW, x, (LPARAM)&rebarBandInfo); 00629 } 00630 } 00631 hResult = ReserveBorderSpace(); 00632 } 00633 return S_OK; 00634 } 00635 00636 HRESULT CInternetToolbar::CommandStateChanged(bool newValue, int commandID) 00637 { 00638 HRESULT hResult; 00639 00640 hResult = S_OK; 00641 switch (commandID) 00642 { 00643 case -1: 00644 // loop through buttons 00645 // for buttons in CLSID_CommonButtons 00646 // if up, QueryStatus for up state and update it 00647 // 00648 // for buttons in fCommandCategory, update with QueryStatus of fCommandTarget 00649 break; 00650 case 1: 00651 // forward 00652 hResult = SetState(&CLSID_CommonButtons, gForwardCommandID, newValue ? TBSTATE_ENABLED : 0); 00653 break; 00654 case 2: 00655 // back 00656 hResult = SetState(&CLSID_CommonButtons, gBackCommandID, newValue ? TBSTATE_ENABLED : 0); 00657 break; 00658 } 00659 return hResult; 00660 } 00661 00662 HRESULT CInternetToolbar::CreateAndInitBandProxy() 00663 { 00664 CComPtr<IServiceProvider> serviceProvider; 00665 HRESULT hResult; 00666 00667 hResult = fSite->QueryInterface(IID_IServiceProvider, (void **)&serviceProvider); 00668 if (FAILED (hResult)) 00669 return hResult; 00670 hResult = serviceProvider->QueryService(SID_IBandProxy, IID_IBandProxy, (void **)&fBandProxy); 00671 if (FAILED (hResult)) 00672 { 00673 hResult = CreateBandProxy(IID_IBandProxy, (void **)&fBandProxy); 00674 if (FAILED (hResult)) 00675 return hResult; 00676 hResult = fBandProxy->SetSite(fSite); 00677 if (FAILED (hResult)) 00678 return hResult; 00679 } 00680 return S_OK; 00681 } 00682 00683 HRESULT STDMETHODCALLTYPE CInternetToolbar::UIActivateIO(BOOL fActivate, LPMSG lpMsg) 00684 { 00685 return E_NOTIMPL; 00686 } 00687 00688 HRESULT STDMETHODCALLTYPE CInternetToolbar::HasFocusIO() 00689 { 00690 return E_NOTIMPL; 00691 } 00692 00693 HRESULT STDMETHODCALLTYPE CInternetToolbar::TranslateAcceleratorIO(LPMSG lpMsg) 00694 { 00695 return E_NOTIMPL; 00696 } 00697 00698 HRESULT STDMETHODCALLTYPE CInternetToolbar::GetWindow(HWND *lphwnd) 00699 { 00700 if (lphwnd == NULL) 00701 return E_POINTER; 00702 *lphwnd = m_hWnd; 00703 return S_OK; 00704 } 00705 00706 HRESULT STDMETHODCALLTYPE CInternetToolbar::ContextSensitiveHelp(BOOL fEnterMode) 00707 { 00708 return E_NOTIMPL; 00709 } 00710 00711 HRESULT STDMETHODCALLTYPE CInternetToolbar::ShowDW(BOOL fShow) 00712 { 00713 CComPtr<IDockingWindow> dockingWindow; 00714 HRESULT hResult; 00715 00716 // show the bar here 00717 hResult = ReserveBorderSpace(); 00718 hResult = fMenuBar->QueryInterface(IID_IDockingWindow, (void **)&dockingWindow); 00719 hResult = dockingWindow->ShowDW(fShow); 00720 return S_OK; 00721 } 00722 00723 HRESULT STDMETHODCALLTYPE CInternetToolbar::CloseDW(DWORD dwReserved) 00724 { 00725 return E_NOTIMPL; 00726 } 00727 00728 HRESULT STDMETHODCALLTYPE CInternetToolbar::ResizeBorderDW(LPCRECT prcBorder, IUnknown *punkToolbarSite, BOOL fReserved) 00729 { 00730 return E_NOTIMPL; 00731 } 00732 00733 HRESULT STDMETHODCALLTYPE CInternetToolbar::GetClassID(CLSID *pClassID) 00734 { 00735 if (pClassID == NULL) 00736 return E_POINTER; 00737 *pClassID = CLSID_InternetToolbar; 00738 return S_OK; 00739 } 00740 00741 HRESULT STDMETHODCALLTYPE CInternetToolbar::IsDirty() 00742 { 00743 return E_NOTIMPL; 00744 } 00745 00746 HRESULT STDMETHODCALLTYPE CInternetToolbar::Load(IStream *pStm) 00747 { 00748 return E_NOTIMPL; 00749 } 00750 00751 HRESULT STDMETHODCALLTYPE CInternetToolbar::Save(IStream *pStm, BOOL fClearDirty) 00752 { 00753 return E_NOTIMPL; 00754 } 00755 00756 HRESULT STDMETHODCALLTYPE CInternetToolbar::GetSizeMax(ULARGE_INTEGER *pcbSize) 00757 { 00758 return E_NOTIMPL; 00759 } 00760 00761 HRESULT STDMETHODCALLTYPE CInternetToolbar::InitNew() 00762 { 00763 CComPtr<IShellMenu> menuBar; 00764 CComPtr<IUnknown> logoBar; 00765 CComPtr<IUnknown> toolsBar; 00766 CComPtr<IUnknown> navigationBar; 00767 CComPtr<IOleWindow> menuOleWindow; 00768 CComPtr<IOleWindow> toolbarOleWindow; 00769 CComPtr<IOleWindow> navigationOleWindow; 00770 HRESULT hResult; 00771 00772 hResult = CreateMenuBar(&menuBar); 00773 if (FAILED(hResult)) 00774 return hResult; 00775 AddDockItem(menuBar, ITBBID_MENUBAND, CDockSite::ITF_NOTITLE | CDockSite::ITF_NEWBANDALWAYS | CDockSite::ITF_GRIPPERALWAYS); 00776 hResult = menuBar->QueryInterface(IID_IOleWindow, (void **)&menuOleWindow); 00777 hResult = menuOleWindow->GetWindow(&fMenuBandWindow); 00778 fMenuBar.Attach(menuBar.Detach()); // transfer the ref count 00779 00780 hResult = CreateBrandBand(&logoBar); 00781 if (FAILED(hResult)) 00782 return hResult; 00783 AddDockItem(logoBar, ITBBID_BRANDBAND, CDockSite::ITF_NOGRIPPER | CDockSite::ITF_NOTITLE | CDockSite::ITF_FIXEDSIZE); 00784 fLogoBar.Attach(logoBar.Detach()); // transfer the ref count 00785 00786 hResult = CreateToolsBar(&toolsBar); 00787 if (FAILED(hResult)) 00788 return hResult; 00789 AddDockItem(toolsBar, ITBBID_TOOLSBAND, CDockSite::ITF_NOTITLE | CDockSite::ITF_NEWBANDALWAYS); 00790 fControlsBar.Attach(toolsBar.Detach()); // transfer the ref count 00791 hResult = fControlsBar->QueryInterface(IID_IOleWindow, (void **)&toolbarOleWindow); 00792 if (FAILED(hResult)) 00793 return hResult; 00794 hResult = toolbarOleWindow->GetWindow(&fToolbarWindow); 00795 if (FAILED(hResult)) 00796 return hResult; 00797 00798 hResult = CreateAddressBand(&navigationBar); 00799 if (FAILED(hResult)) 00800 return hResult; 00801 AddDockItem(navigationBar, ITBBID_ADDRESSBAND, CDockSite::ITF_NEWBANDALWAYS); 00802 hResult = navigationBar->QueryInterface(IID_IOleWindow, (void **)&navigationOleWindow); 00803 hResult = navigationOleWindow->GetWindow(&fNavigationWindow); 00804 fNavigationBar.Attach(navigationBar.Detach()); 00805 00806 return S_OK; 00807 } 00808 00809 HRESULT STDMETHODCALLTYPE CInternetToolbar::QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[ ], OLECMDTEXT *pCmdText) 00810 { 00811 if (IsEqualIID(*pguidCmdGroup, CGID_PrivCITCommands)) 00812 { 00813 while (cCmds != 0) 00814 { 00815 switch (prgCmds->cmdID) 00816 { 00817 case ITID_TEXTLABELS: // Text Labels state 00818 prgCmds->cmdf = OLECMDF_SUPPORTED; 00819 break; 00820 case ITID_TOOLBARBANDSHOWN: // toolbar visibility 00821 prgCmds->cmdf = OLECMDF_SUPPORTED | OLECMDF_ENABLED; 00822 break; 00823 case ITID_ADDRESSBANDSHOWN: // address bar visibility 00824 prgCmds->cmdf = OLECMDF_SUPPORTED | OLECMDF_ENABLED; 00825 break; 00826 case ITID_LINKSBANDSHOWN: // links bar visibility 00827 prgCmds->cmdf = 0; 00828 break; 00829 case ITID_MENUBANDSHOWN: // Menubar band visibility 00830 prgCmds->cmdf = 0; 00831 break; 00832 case ITID_AUTOHIDEENABLED: // Auto hide enabled/disabled 00833 prgCmds->cmdf = 0; 00834 break; 00835 case ITID_CUSTOMIZEENABLED: // customize enabled 00836 prgCmds->cmdf = OLECMDF_SUPPORTED | OLECMDF_ENABLED; 00837 break; 00838 case ITID_TOOLBARLOCKED: // lock toolbars 00839 prgCmds->cmdf = OLECMDF_SUPPORTED | OLECMDF_ENABLED; 00840 if (fLocked) 00841 prgCmds->cmdf |= OLECMDF_LATCHED; 00842 break; 00843 default: 00844 prgCmds->cmdf = 0; 00845 break; 00846 } 00847 prgCmds++; 00848 cCmds--; 00849 } 00850 return S_OK; 00851 } 00852 return E_FAIL; 00853 } 00854 00855 HRESULT STDMETHODCALLTYPE CInternetToolbar::Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut) 00856 { 00857 if (IsEqualIID(*pguidCmdGroup, CGID_PrivCITCommands)) 00858 { 00859 switch (nCmdID) 00860 { 00861 case 1: 00862 // what do I do here? 00863 return S_OK; 00864 case ITID_TEXTLABELS: 00865 // toggle text labels 00866 return S_OK; 00867 case ITID_TOOLBARBANDSHOWN: 00868 // toggle toolbar band visibility 00869 return S_OK; 00870 case ITID_ADDRESSBANDSHOWN: 00871 // toggle address band visibility 00872 return S_OK; 00873 case ITID_LINKSBANDSHOWN: 00874 // toggle links band visibility 00875 return S_OK; 00876 case ITID_CUSTOMIZEENABLED: 00877 // run customize 00878 return S_OK; 00879 case ITID_TOOLBARLOCKED: 00880 return LockUnlockToolbars(!fLocked); 00881 } 00882 } 00883 return E_FAIL; 00884 } 00885 00886 HRESULT STDMETHODCALLTYPE CInternetToolbar::GetTypeInfoCount(UINT *pctinfo) 00887 { 00888 return E_NOTIMPL; 00889 } 00890 00891 HRESULT STDMETHODCALLTYPE CInternetToolbar::GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo) 00892 { 00893 return E_NOTIMPL; 00894 } 00895 00896 HRESULT STDMETHODCALLTYPE CInternetToolbar::GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId) 00897 { 00898 return E_NOTIMPL; 00899 } 00900 00901 HRESULT STDMETHODCALLTYPE CInternetToolbar::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) 00902 { 00903 HRESULT hResult; 00904 00905 switch(dispIdMember) 00906 { 00907 case DISPID_BEFORENAVIGATE: 00908 hResult = S_OK; 00909 break; 00910 case DISPID_DOWNLOADCOMPLETE: 00911 hResult = S_OK; 00912 break; 00913 case DISPID_COMMANDSTATECHANGE: 00914 if (pDispParams->cArgs != 2) 00915 return E_INVALIDARG; 00916 if (V_VT(&pDispParams->rgvarg[0]) != VT_BOOL || V_VT(&pDispParams->rgvarg[1]) != VT_I4) 00917 return E_INVALIDARG; 00918 return CommandStateChanged(V_BOOL(&pDispParams->rgvarg[0]) == VARIANT_FALSE ? false : true, 00919 V_I4(&pDispParams->rgvarg[1])); 00920 case DISPID_DOWNLOADBEGIN: 00921 hResult = S_OK; 00922 break; 00923 case DISPID_NAVIGATECOMPLETE2: 00924 hResult = S_OK; 00925 break; 00926 case DISPID_DOCUMENTCOMPLETE: 00927 hResult = S_OK; 00928 break; 00929 } 00930 return S_OK; 00931 } 00932 00933 HRESULT STDMETHODCALLTYPE CInternetToolbar::SetCommandTarget(IUnknown *theTarget, GUID *category, long param14) 00934 { 00935 HRESULT hResult; 00936 00937 fCommandTarget.Release(); 00938 hResult = theTarget->QueryInterface(IID_IOleCommandTarget, (void **)&fCommandTarget); 00939 if (FAILED(hResult)) 00940 return hResult; 00941 fCommandCategory = *category; 00942 return S_OK; 00943 } 00944 00945 HRESULT STDMETHODCALLTYPE CInternetToolbar::Unknown1() 00946 { 00947 return E_NOTIMPL; 00948 } 00949 00950 HRESULT STDMETHODCALLTYPE CInternetToolbar::AddButtons(const GUID *pguidCmdGroup, long buttonCount, TBBUTTON *buttons) 00951 { 00952 return E_NOTIMPL; 00953 } 00954 00955 HRESULT STDMETHODCALLTYPE CInternetToolbar::AddString(const GUID *pguidCmdGroup, HINSTANCE param10, LPCTSTR param14, long *param18) 00956 { 00957 long result; 00958 00959 result = (long)::SendMessage(fToolbarWindow, TB_ADDSTRINGW, (WPARAM)param10, (LPARAM)param14); 00960 *param18 = result; 00961 if (result == -1) 00962 return E_FAIL; 00963 return S_OK; 00964 } 00965 00966 HRESULT STDMETHODCALLTYPE CInternetToolbar::GetButton(const GUID *pguidCmdGroup, long param10, long param14) 00967 { 00968 return E_NOTIMPL; 00969 } 00970 00971 HRESULT STDMETHODCALLTYPE CInternetToolbar::GetState(const GUID *pguidCmdGroup, long commandID, long *theState) 00972 { 00973 if (theState == NULL) 00974 return E_POINTER; 00975 // map the command id 00976 *theState = (long)::SendMessage(fToolbarWindow, TB_GETSTATE, commandID, 0); 00977 return S_OK; 00978 } 00979 00980 HRESULT STDMETHODCALLTYPE CInternetToolbar::SetState(const GUID *pguidCmdGroup, long commandID, long theState) 00981 { 00982 // map the command id 00983 ::SendMessage(fToolbarWindow, TB_SETSTATE, commandID, MAKELONG(theState, 0)); 00984 return S_OK; 00985 } 00986 00987 HRESULT STDMETHODCALLTYPE CInternetToolbar::AddBitmap(const GUID *pguidCmdGroup, long param10, long buttonCount, TBADDBITMAP *lParam, long *newIndex, COLORREF param20) 00988 { 00989 return E_NOTIMPL; 00990 } 00991 00992 HRESULT STDMETHODCALLTYPE CInternetToolbar::GetBitmapSize(long *paramC) 00993 { 00994 if (paramC == NULL) 00995 return E_POINTER; 00996 *paramC = MAKELONG(24, 24); 00997 return S_OK; 00998 } 00999 01000 HRESULT STDMETHODCALLTYPE CInternetToolbar::SendToolbarMsg(const GUID *pguidCmdGroup, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *result) 01001 { 01002 return E_NOTIMPL; 01003 } 01004 01005 HRESULT STDMETHODCALLTYPE CInternetToolbar::SetImageList(const GUID *pguidCmdGroup, HIMAGELIST param10, HIMAGELIST param14, HIMAGELIST param18) 01006 { 01007 return E_NOTIMPL; 01008 } 01009 01010 HRESULT STDMETHODCALLTYPE CInternetToolbar::ModifyButton(const GUID *pguidCmdGroup, long param10, long param14) 01011 { 01012 return E_NOTIMPL; 01013 } 01014 01015 HRESULT STDMETHODCALLTYPE CInternetToolbar::OnChange(LONG lEvent, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) 01016 { 01017 return E_NOTIMPL; 01018 } 01019 01020 HRESULT STDMETHODCALLTYPE CInternetToolbar::SetSite(IUnknown *pUnkSite) 01021 { 01022 CComPtr<IBrowserService> browserService; 01023 CComPtr<IServiceProvider> serviceProvider; 01024 CComPtr<IOleWindow> oleWindow; 01025 HWND ownerWindow; 01026 HWND dockContainer; 01027 HRESULT hResult; 01028 01029 if (pUnkSite == NULL) 01030 { 01031 hResult = AtlUnadvise(fSite, DIID_DWebBrowserEvents, fAdviseCookie); 01032 ::DestroyWindow(fMainReBar); 01033 DestroyWindow(); 01034 fSite.Release(); 01035 } 01036 else 01037 { 01038 hResult = pUnkSite->QueryInterface(IID_IOleWindow, (void **)&oleWindow); 01039 if (FAILED(hResult)) 01040 return hResult; 01041 hResult = oleWindow->GetWindow(&ownerWindow); 01042 if (FAILED(hResult)) 01043 return hResult; 01044 if (ownerWindow == NULL) 01045 return E_FAIL; 01046 fSite = pUnkSite; 01047 dockContainer = SHCreateWorkerWindowW(0, ownerWindow, 0, WS_VISIBLE | WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, NULL, 0); 01048 if (dockContainer == NULL) 01049 return E_FAIL; 01050 SubclassWindow(dockContainer); 01051 fMainReBar = CreateWindow(REBARCLASSNAMEW, _T(""), WS_VISIBLE | WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | RBS_VARHEIGHT | 01052 RBS_BANDBORDERS | RBS_REGISTERDROP | RBS_AUTOSIZE | CCS_NODIVIDER | CCS_NOPARENTALIGN | CCS_TOP, 01053 0, 0, 700, 60, dockContainer, NULL, _AtlBaseModule.GetModuleInstance(), NULL); 01054 if (fMainReBar == NULL) 01055 return E_FAIL; 01056 hResult = pUnkSite->QueryInterface(IID_IServiceProvider, (void **)&serviceProvider); 01057 hResult = serviceProvider->QueryService(SID_SShellBrowser, IID_IBrowserService, (void **)&browserService); 01058 hResult = AtlAdvise(browserService, (IDispatch *)this, DIID_DWebBrowserEvents, &fAdviseCookie); 01059 } 01060 return S_OK; 01061 } 01062 01063 HRESULT STDMETHODCALLTYPE CInternetToolbar::GetSite(REFIID riid, void **ppvSite) 01064 { 01065 if (ppvSite == NULL) 01066 return E_POINTER; 01067 if (fSite.p != NULL) 01068 return fSite->QueryInterface(riid, ppvSite); 01069 *ppvSite = NULL; 01070 return S_OK; 01071 } 01072 01073 HRESULT STDMETHODCALLTYPE CInternetToolbar::QueryService(REFGUID guidService, REFIID riid, void **ppvObject) 01074 { 01075 CComPtr<IServiceProvider> serviceProvider; 01076 HRESULT hResult; 01077 01078 if (IsEqualIID(guidService, IID_IBandSite)) 01079 return this->QueryInterface(riid, ppvObject); 01080 if (IsEqualIID(guidService, SID_IBandProxy)) 01081 { 01082 if (fBandProxy.p == NULL) 01083 { 01084 hResult = CreateAndInitBandProxy(); 01085 if (FAILED (hResult)) 01086 return hResult; 01087 } 01088 return fBandProxy->QueryInterface(riid, ppvObject); 01089 } 01090 hResult = fSite->QueryInterface(IID_IServiceProvider, (void **)&serviceProvider); 01091 if (FAILED (hResult)) 01092 return hResult; 01093 return serviceProvider->QueryService(guidService, riid, ppvObject); 01094 } 01095 01096 HRESULT STDMETHODCALLTYPE CInternetToolbar::OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *theResult) 01097 { 01098 CComPtr<IWinEventHandler> menuWinEventHandler; 01099 HRESULT hResult; 01100 01101 if (fMenuBar.p != NULL) 01102 { 01103 hResult = fMenuBar->QueryInterface(IID_IWinEventHandler, (void **)&menuWinEventHandler); 01104 return menuWinEventHandler->OnWinEvent(fMenuBandWindow, uMsg, wParam, lParam, theResult); 01105 } 01106 return E_FAIL; 01107 } 01108 01109 HRESULT STDMETHODCALLTYPE CInternetToolbar::IsWindowOwner(HWND hWnd) 01110 { 01111 return E_NOTIMPL; 01112 } 01113 01114 HRESULT STDMETHODCALLTYPE CInternetToolbar::AddBand(IUnknown *punk) 01115 { 01116 return E_NOTIMPL; 01117 } 01118 01119 HRESULT STDMETHODCALLTYPE CInternetToolbar::EnumBands(UINT uBand, DWORD *pdwBandID) 01120 { 01121 return E_NOTIMPL; 01122 } 01123 01124 HRESULT STDMETHODCALLTYPE CInternetToolbar::QueryBand(DWORD dwBandID, IDeskBand **ppstb, DWORD *pdwState, LPWSTR pszName, int cchName) 01125 { 01126 if (ppstb == NULL) 01127 return E_POINTER; 01128 if (dwBandID == ITBBID_MENUBAND && fMenuBar.p != NULL) 01129 return fMenuBar->QueryInterface(IID_IDeskBand, (void **)ppstb); 01130 if (dwBandID == ITBBID_BRANDBAND && fLogoBar.p != NULL) 01131 return fLogoBar->QueryInterface(IID_IDeskBand, (void **)ppstb); 01132 *ppstb = NULL; 01133 return E_FAIL; 01134 } 01135 01136 HRESULT STDMETHODCALLTYPE CInternetToolbar::SetBandState(DWORD dwBandID, DWORD dwMask, DWORD dwState) 01137 { 01138 return E_NOTIMPL; 01139 } 01140 01141 HRESULT STDMETHODCALLTYPE CInternetToolbar::RemoveBand(DWORD dwBandID) 01142 { 01143 return E_NOTIMPL; 01144 } 01145 01146 HRESULT STDMETHODCALLTYPE CInternetToolbar::GetBandObject(DWORD dwBandID, REFIID riid, void **ppv) 01147 { 01148 return E_NOTIMPL; 01149 } 01150 01151 HRESULT STDMETHODCALLTYPE CInternetToolbar::SetBandSiteInfo(const BANDSITEINFO *pbsinfo) 01152 { 01153 return E_NOTIMPL; 01154 } 01155 01156 HRESULT STDMETHODCALLTYPE CInternetToolbar::GetBandSiteInfo(BANDSITEINFO *pbsinfo) 01157 { 01158 return E_NOTIMPL; 01159 } 01160 01161 LRESULT CInternetToolbar::OnTravelBack(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled) 01162 { 01163 CComPtr<IServiceProvider> serviceProvider; 01164 CComPtr<IWebBrowser> webBrowser; 01165 HRESULT hResult; 01166 01167 hResult = fSite->QueryInterface(IID_IServiceProvider, (void **)&serviceProvider); 01168 if (FAILED (hResult)) 01169 return 0; 01170 hResult = serviceProvider->QueryService(SID_SShellBrowser, IID_IWebBrowser, (void **)&webBrowser); 01171 if (FAILED (hResult)) 01172 return 0; 01173 hResult = webBrowser->GoBack(); 01174 return 1; 01175 } 01176 01177 LRESULT CInternetToolbar::OnTravelForward(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled) 01178 { 01179 CComPtr<IServiceProvider> serviceProvider; 01180 CComPtr<IWebBrowser> webBrowser; 01181 HRESULT hResult; 01182 01183 hResult = fSite->QueryInterface(IID_IServiceProvider, (void **)&serviceProvider); 01184 if (FAILED (hResult)) 01185 return 0; 01186 hResult = serviceProvider->QueryService(SID_SShellBrowser, IID_IWebBrowser, (void **)&webBrowser); 01187 if (FAILED (hResult)) 01188 return 0; 01189 hResult = webBrowser->GoForward(); 01190 return 1; 01191 } 01192 01193 LRESULT CInternetToolbar::OnUpLevel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled) 01194 { 01195 CComPtr<IOleCommandTarget> oleCommandTarget; 01196 HRESULT hResult; 01197 01198 hResult = fSite->QueryInterface(IID_IOleCommandTarget, (void **)&oleCommandTarget); 01199 if (FAILED (hResult)) 01200 return hResult; 01201 hResult = oleCommandTarget->Exec(&CGID_ShellBrowser, IDM_GOTO_UPONELEVEL, 0, NULL, NULL); 01202 return 1; 01203 } 01204 01205 LRESULT CInternetToolbar::OnSearch(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled) 01206 { 01207 CComPtr<IObjectWithSite> objectWithSite; 01208 CComPtr<IContextMenu> contextMenu; 01209 CMINVOKECOMMANDINFO commandInfo; 01210 const char *searchGUID = "{169A0691-8DF9-11d1-A1C4-00C04FD75D13}"; 01211 HRESULT hResult; 01212 01213 // TODO: Query shell if this command is enabled first 01214 01215 memset(&commandInfo, 0, sizeof(commandInfo)); 01216 commandInfo.cbSize = sizeof(commandInfo); 01217 commandInfo.hwnd = m_hWnd; 01218 commandInfo.lpParameters = searchGUID; 01219 commandInfo.nShow = SW_SHOWNORMAL; 01220 01221 hResult = CoCreateInstance(CLSID_ShellSearchExt, NULL, CLSCTX_INPROC_SERVER, IID_IContextMenu, (void **)&contextMenu); 01222 if (FAILED (hResult)) 01223 return 0; 01224 hResult = contextMenu->QueryInterface(IID_IObjectWithSite, (void **)&objectWithSite); 01225 if (FAILED (hResult)) 01226 return 0; 01227 hResult = objectWithSite->SetSite(fSite); 01228 if (FAILED (hResult)) 01229 return 0; 01230 hResult = contextMenu->InvokeCommand(&commandInfo); 01231 hResult = objectWithSite->SetSite(NULL); 01232 return 0; 01233 } 01234 01235 LRESULT CInternetToolbar::OnFolders(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled) 01236 { 01237 CComPtr<IOleCommandTarget> oleCommandTarget; 01238 HRESULT hResult; 01239 01240 hResult = fSite->QueryInterface(IID_IOleCommandTarget, (void **)&oleCommandTarget); 01241 if (FAILED (hResult)) 01242 return hResult; 01243 hResult = oleCommandTarget->Exec(&CGID_Explorer, 0x23, 0, NULL, NULL); 01244 return 1; 01245 } 01246 01247 LRESULT CInternetToolbar::OnForwardToCommandTarget(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled) 01248 { 01249 HRESULT hResult; 01250 01251 if (fCommandTarget.p != NULL) 01252 { 01253 hResult = fCommandTarget->Exec(&fCommandCategory, wID, 0, NULL, NULL); 01254 } 01255 return 1; 01256 } 01257 01258 LRESULT CInternetToolbar::OnMenuDropDown(UINT idControl, NMHDR *pNMHDR, BOOL &bHandled) 01259 { 01260 CComPtr<IServiceProvider> serviceProvider; 01261 CComPtr<IBrowserService> browserService; 01262 CComPtr<IOleCommandTarget> commandTarget; 01263 CComPtr<ITravelLog> travelLog; 01264 NMTOOLBARW *notifyInfo; 01265 RECT bounds; 01266 HMENU newMenu; 01267 TPMPARAMS params; 01268 int selectedItem; 01269 VARIANT parmIn; 01270 OLECMD commandInfo; 01271 HRESULT hResult; 01272 01273 notifyInfo = (NMTOOLBARW *)pNMHDR; 01274 if (notifyInfo->hdr.hwndFrom != fToolbarWindow) 01275 { 01276 // not from the toolbar, keep looking for a message handler 01277 bHandled = FALSE; 01278 return 0; 01279 } 01280 SendMessage(fToolbarWindow, TB_GETRECT, notifyInfo->iItem, (LPARAM)&bounds); 01281 ::MapWindowPoints(fToolbarWindow, NULL, (POINT *)&bounds, 2); 01282 switch (notifyInfo->iItem) 01283 { 01284 case gBackCommandID: 01285 newMenu = CreatePopupMenu(); 01286 hResult = fSite->QueryInterface(IID_IServiceProvider, (void **)&serviceProvider); 01287 hResult = serviceProvider->QueryService(SID_SShellBrowser, IID_IBrowserService, (void **)&browserService); 01288 hResult = browserService->GetTravelLog(&travelLog); 01289 hResult = travelLog->InsertMenuEntries(browserService, newMenu, 0, 1, 9, TLMENUF_BACK); 01290 hResult = browserService->QueryInterface(IID_IOleCommandTarget, (void **)&commandTarget); 01291 commandInfo.cmdID = 0x1d; 01292 hResult = commandTarget->QueryStatus(&CGID_Explorer, 1, &commandInfo, NULL); 01293 if ((commandInfo.cmdf & (OLECMDF_ENABLED | OLECMDF_LATCHED)) == OLECMDF_ENABLED && travelLog->CountEntries(browserService) > 1) 01294 { 01295 AppendMenu(newMenu, MF_SEPARATOR, -1, L""); 01296 AppendMenu(newMenu, MF_STRING /* | MF_OWNERDRAW */, IDM_EXPLORERBAR_HISTORY, L"&History\tCtrl+H"); 01297 } 01298 params.cbSize = sizeof (params); 01299 params.rcExclude = bounds; 01300 selectedItem = TrackPopupMenuEx(newMenu, TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RETURNCMD, 01301 bounds.left, bounds.bottom, m_hWnd, ¶ms); 01302 if (selectedItem == IDM_EXPLORERBAR_HISTORY) 01303 { 01304 V_VT(&parmIn) = VT_I4; 01305 V_I4(&parmIn) = 1; 01306 Exec(&CGID_Explorer, 0x1d, 2, &parmIn, NULL); 01307 } 01308 else if (selectedItem != 0) 01309 hResult = travelLog->Travel(browserService, -selectedItem); 01310 DestroyMenu(newMenu); 01311 break; 01312 case gForwardCommandID: 01313 newMenu = CreatePopupMenu(); 01314 hResult = fSite->QueryInterface(IID_IServiceProvider, (void **)&serviceProvider); 01315 hResult = serviceProvider->QueryService(SID_SShellBrowser, IID_IBrowserService, (void **)&browserService); 01316 hResult = browserService->GetTravelLog(&travelLog); 01317 hResult = travelLog->InsertMenuEntries(browserService, newMenu, 0, 1, 9, TLMENUF_FORE); 01318 hResult = browserService->QueryInterface(IID_IOleCommandTarget, (void **)&commandTarget); 01319 commandInfo.cmdID = 0x1d; 01320 hResult = commandTarget->QueryStatus(&CGID_Explorer, 1, &commandInfo, NULL); 01321 if ((commandInfo.cmdf & (OLECMDF_ENABLED | OLECMDF_LATCHED)) == OLECMDF_ENABLED && travelLog->CountEntries(browserService) > 1) 01322 { 01323 AppendMenu(newMenu, MF_SEPARATOR, -1, L""); 01324 AppendMenu(newMenu, MF_STRING /* | MF_OWNERDRAW */, IDM_EXPLORERBAR_HISTORY, L"&History\tCtrl+H"); 01325 } 01326 params.cbSize = sizeof (params); 01327 params.rcExclude = bounds; 01328 selectedItem = TrackPopupMenuEx(newMenu, TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RETURNCMD, 01329 bounds.left, bounds.bottom, m_hWnd, ¶ms); 01330 if (selectedItem == IDM_EXPLORERBAR_HISTORY) 01331 { 01332 V_VT(&parmIn) = VT_I4; 01333 V_I4(&parmIn) = 1; 01334 Exec(&CGID_Explorer, 0x1d, 2, &parmIn, NULL); 01335 } 01336 else if (selectedItem != 0) 01337 hResult = travelLog->Travel(browserService, -selectedItem); 01338 DestroyMenu(newMenu); 01339 break; 01340 case gViewsCommandID: 01341 VARIANT inValue; 01342 CComVariant outValue; 01343 HRESULT hResult; 01344 01345 V_VT(&inValue) = VT_INT_PTR; 01346 V_INTREF(&inValue) = (INT *)&bounds; 01347 01348 if (fCommandTarget.p != NULL) 01349 hResult = fCommandTarget->Exec(&fCommandCategory, 0x7031, 1, &inValue, &outValue); 01350 // pvaOut is VT_I4 with value 0x403 01351 break; 01352 } 01353 return TBDDRET_DEFAULT; 01354 } 01355 01356 LRESULT CInternetToolbar::OnQueryInsert(UINT idControl, NMHDR *pNMHDR, BOOL &bHandled) 01357 { 01358 return 1; 01359 } 01360 01361 LRESULT CInternetToolbar::OnQueryDelete(UINT idControl, NMHDR *pNMHDR, BOOL &bHandled) 01362 { 01363 return 1; 01364 } 01365 01366 LRESULT CInternetToolbar::OnNavigateCommand(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) 01367 { 01368 CComPtr<IWinEventHandler> winEventHandler; 01369 LRESULT theResult; 01370 HRESULT hResult; 01371 01372 hResult = fNavigationBar->QueryInterface(IID_IWinEventHandler, (void **)&winEventHandler); 01373 hResult = winEventHandler->OnWinEvent(m_hWnd, uMsg, wParam, lParam, &theResult); 01374 if (SUCCEEDED(hResult)) 01375 return theResult; 01376 bHandled = FALSE; 01377 return 0; 01378 } 01379 01380 LRESULT CInternetToolbar::OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) 01381 { 01382 HMENU contextMenuBar; 01383 HMENU contextMenu; 01384 POINT clickLocation; 01385 int command; 01386 RBHITTESTINFO hitTestInfo; 01387 REBARBANDINFOW rebarBandInfo; 01388 int bandID; 01389 01390 clickLocation.x = LOWORD(lParam); 01391 clickLocation.y = HIWORD(lParam); 01392 hitTestInfo.pt = clickLocation; 01393 ScreenToClient(&hitTestInfo.pt); 01394 SendMessage(fMainReBar, RB_HITTEST, 0, (LPARAM)&hitTestInfo); 01395 if (hitTestInfo.iBand == -1) 01396 return 0; 01397 rebarBandInfo.cbSize = sizeof(rebarBandInfo); 01398 rebarBandInfo.fMask = RBBIM_ID; 01399 SendMessage(fMainReBar, RB_GETBANDINFOW, hitTestInfo.iBand, (LPARAM)&rebarBandInfo); 01400 bandID = rebarBandInfo.wID; 01401 contextMenuBar = LoadMenu(_AtlBaseModule.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_CONTEXTMENU)); 01402 contextMenu = GetSubMenu(contextMenuBar, 0); 01403 switch (bandID) 01404 { 01405 case ITBBID_MENUBAND: // menu band 01406 DeleteMenu(contextMenu, IDM_TOOLBARS_CUSTOMIZE, MF_BYCOMMAND); 01407 DeleteMenu(contextMenu, IDM_TOOLBARS_TEXTLABELS, MF_BYCOMMAND); 01408 DeleteMenu(contextMenu, IDM_TOOLBARS_GOBUTTON, MF_BYCOMMAND); 01409 break; 01410 case ITBBID_BRANDBAND: // brand band 01411 DeleteMenu(contextMenu, IDM_TOOLBARS_CUSTOMIZE, MF_BYCOMMAND); 01412 DeleteMenu(contextMenu, IDM_TOOLBARS_TEXTLABELS, MF_BYCOMMAND); 01413 DeleteMenu(contextMenu, IDM_TOOLBARS_GOBUTTON, MF_BYCOMMAND); 01414 break; 01415 case ITBBID_TOOLSBAND: // tools band 01416 DeleteMenu(contextMenu, IDM_TOOLBARS_TEXTLABELS, MF_BYCOMMAND); 01417 DeleteMenu(contextMenu, IDM_TOOLBARS_GOBUTTON, MF_BYCOMMAND); 01418 break; 01419 case ITBBID_ADDRESSBAND: // navigation band 01420 DeleteMenu(contextMenu, IDM_TOOLBARS_CUSTOMIZE, MF_BYCOMMAND); 01421 DeleteMenu(contextMenu, IDM_TOOLBARS_TEXTLABELS, MF_BYCOMMAND); 01422 break; 01423 default: 01424 break; 01425 } 01426 // TODO: use GetSystemMetrics(SM_MENUDROPALIGNMENT) to determine menu alignment 01427 command = TrackPopupMenu(contextMenu, TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD, 01428 clickLocation.x, clickLocation.y, 0, m_hWnd, NULL); 01429 switch (command) 01430 { 01431 case IDM_TOOLBARS_STANDARDBUTTONS: // standard buttons 01432 break; 01433 case IDM_TOOLBARS_ADDRESSBAR: // address bar 01434 break; 01435 case IDM_TOOLBARS_LINKSBAR: // links 01436 break; 01437 case IDM_TOOLBARS_LOCKTOOLBARS: // lock the toolbars 01438 LockUnlockToolbars(!fLocked); 01439 break; 01440 case IDM_TOOLBARS_CUSTOMIZE: // customize 01441 SendMessage(fToolbarWindow, TB_CUSTOMIZE, 0, 0); 01442 break; 01443 } 01444 return 1; 01445 } 01446 01447 LRESULT CInternetToolbar::OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) 01448 { 01449 if (wParam != SIZE_MINIMIZED) 01450 { 01451 ::SetWindowPos(fMainReBar, NULL, 0, 0, LOWORD(lParam), HIWORD(lParam), SWP_NOOWNERZORDER | SWP_NOZORDER | SWP_NOMOVE); 01452 } 01453 return 1; 01454 } 01455 01456 LRESULT CInternetToolbar::OnSetCursor(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) 01457 { 01458 if ((short)lParam != HTCLIENT || (HWND)wParam != m_hWnd) 01459 { 01460 bHandled = FALSE; 01461 return 0; 01462 } 01463 SetCursor(LoadCursor(NULL, IDC_SIZENS)); 01464 return 1; 01465 } 01466 01467 LRESULT CInternetToolbar::OnTipText(UINT idControl, NMHDR *pNMHDR, BOOL &bHandled) 01468 { 01469 CComPtr<IBrowserService> browserService; 01470 CComPtr<ITravelLog> travelLog; 01471 TOOLTIPTEXTW *pTTTW; 01472 UINT nID; 01473 wchar_t tempString[300]; 01474 HRESULT hResult; 01475 01476 pTTTW = (TOOLTIPTEXTW *)pNMHDR; 01477 if ((pTTTW->uFlags & TTF_IDISHWND) != 0) 01478 nID = ::GetDlgCtrlID((HWND)pNMHDR->idFrom); 01479 else 01480 nID = (UINT)pNMHDR->idFrom; 01481 01482 if (nID != 0) 01483 { 01484 if (nID == (UINT)gBackCommandID || nID == (UINT)gForwardCommandID) 01485 { 01486 // TODO: Should this call QueryService? 01487 hResult = fSite->QueryInterface(IID_IBrowserService, (void **)&browserService); 01488 hResult = browserService->GetTravelLog(&travelLog); 01489 hResult = travelLog->GetToolTipText(browserService, nID == (UINT)gBackCommandID ? TLOG_BACK : TLOG_FORE, 01490 0, tempString, 299); 01491 if (FAILED(hResult)) 01492 { 01493 bHandled = FALSE; 01494 return 0; 01495 } 01496 } 01497 else 01498 tempString[0] = 0; 01499 wcsncpy (pTTTW->szText, tempString, sizeof (pTTTW->szText) / sizeof (wchar_t)); 01500 ::SetWindowPos (pNMHDR->hwndFrom, HWND_TOP, 0, 0, 0, 0, SWP_NOOWNERZORDER | SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE); 01501 return 0; 01502 } 01503 return 0; 01504 } 01505 01506 LRESULT CInternetToolbar::OnNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) 01507 { 01508 NMHDR *notifyHeader; 01509 CComPtr<IWinEventHandler> menuWinEventHandler; 01510 LRESULT theResult; 01511 HRESULT hResult; 01512 01513 notifyHeader = (NMHDR *)lParam; 01514 if (fMenuBar.p != NULL && notifyHeader->hwndFrom == fMenuBandWindow) 01515 { 01516 hResult = fMenuBar->QueryInterface(IID_IWinEventHandler, (void **)&menuWinEventHandler); 01517 hResult = menuWinEventHandler->OnWinEvent(fMenuBandWindow, uMsg, wParam, lParam, &theResult); 01518 return theResult; 01519 } 01520 if (fNavigationBar.p != NULL && notifyHeader->hwndFrom == fNavigationWindow) 01521 { 01522 hResult = fNavigationBar->QueryInterface(IID_IWinEventHandler, (void **)&menuWinEventHandler); 01523 hResult = menuWinEventHandler->OnWinEvent(m_hWnd, uMsg, wParam, lParam, &theResult); 01524 return theResult; 01525 } 01526 return 0; 01527 } 01528 01529 HRESULT CreateInternetToolbar(REFIID riid, void **ppv) 01530 { 01531 CComObject<CInternetToolbar> *theToolbar; 01532 HRESULT hResult; 01533 01534 if (ppv == NULL) 01535 return E_POINTER; 01536 *ppv = NULL; 01537 ATLTRY (theToolbar = new CComObject<CInternetToolbar>); 01538 if (theToolbar == NULL) 01539 return E_OUTOFMEMORY; 01540 hResult = theToolbar->QueryInterface (riid, (void **)ppv); 01541 if (FAILED (hResult)) 01542 { 01543 delete theToolbar; 01544 return hResult; 01545 } 01546 return S_OK; 01547 } Generated on Sun May 27 2012 04:22:55 for ReactOS by
1.7.6.1
|