ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

internettoolbar.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, &params);
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, &params);
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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.