[BROWSEUI]
[reactos.git] / reactos / dll / win32 / browseui / internettoolbar.cpp
index bda3caf..8b5717b 100644 (file)
@@ -29,14 +29,7 @@ toolbar, and address band for an explorer window
 #define GET_X_LPARAM(lp) ((int)(short)LOWORD(lp))
 #define GET_Y_LPARAM(lp) ((int)(short)HIWORD(lp))
 
-#define USE_CUSTOM_MENUBAND 1
-HMODULE g_hRShell = NULL;
-
 #if 1
-// TODO: declare these GUIDs and interfaces in the right place (whatever that may be)
-
-IID IID_IAugmentedShellFolder = { 0x91EA3F8C, 0xC99B, 0x11D0, { 0x98, 0x15, 0x00, 0xC0, 0x4F, 0xD9, 0x19, 0x72 } };
-CLSID CLSID_MergedFolder = { 0x26FDC864, 0xBE88, 0x46E7, { 0x92, 0x35, 0x03, 0x2D, 0x8E, 0xA5, 0x16, 0x2E } };
 
 interface IAugmentedShellFolder : public IShellFolder
 {
@@ -85,39 +78,6 @@ TODO:
 */
 
 extern HRESULT WINAPI SHBindToFolder(LPCITEMIDLIST path, IShellFolder **newFolder);
-extern HRESULT CreateToolsBar(REFIID riid, void **ppv);
-extern HRESULT CreateBrandBand(REFIID riid, void **ppv);
-extern HRESULT CreateBandProxy(REFIID riid, void **ppv);
-extern HRESULT CreateAddressBand(REFIID riid, void **ppv);
-
-typedef HRESULT(WINAPI * PMENUBAND_CONSTRUCTOR)(REFIID riid, void **ppv);
-typedef HRESULT(WINAPI * PMERGEDFOLDER_CONSTRUCTOR)(REFIID riid, void **ppv);
-
-HMODULE hRShell = NULL;
-PMERGEDFOLDER_CONSTRUCTOR pCMergedFolder_Constructor = NULL;
-PMENUBAND_CONSTRUCTOR     pCMenuBand_Constructor = NULL;
-
-HRESULT IUnknown_HasFocusIO(IUnknown * punk)
-{
-    CComPtr<IInputObject> pio;
-    HRESULT hr;
-    hr = punk->QueryInterface(IID_PPV_ARG(IInputObject, &pio));
-    if (FAILED_UNEXPECTEDLY(hr))
-        return hr;
-    return pio->HasFocusIO();
-}
-
-HRESULT IUnknown_TranslateAcceleratorIO(IUnknown * punk, MSG * pmsg)
-{
-    CComPtr<IInputObject> pio;
-    HRESULT hr;
-    if (!punk)
-        return E_FAIL;
-    hr = punk->QueryInterface(IID_PPV_ARG(IInputObject, &pio));
-    if (FAILED_UNEXPECTEDLY(hr))
-        return hr;
-    return pio->TranslateAcceleratorIO(pmsg);
-}
 
 HRESULT IUnknown_RelayWinEvent(IUnknown * punk, HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *theResult)
 {
@@ -478,28 +438,7 @@ static HRESULT GetFavoritesFolder(IShellFolder ** ppsfFavorites, LPITEMIDLIST *
     if (FAILED_UNEXPECTEDLY(hr))
         return hr;
 
-#if 1
-    if (!hRShell)
-    {
-        hRShell = GetModuleHandle(L"rshell.dll");
-        if (!hRShell)
-            hRShell = LoadLibrary(L"rshell.dll");
-    }
-
-    if (!pCMergedFolder_Constructor)
-        pCMergedFolder_Constructor = (PMERGEDFOLDER_CONSTRUCTOR) GetProcAddress(hRShell, "CMergedFolder_Constructor");
-
-    if (pCMergedFolder_Constructor)
-    {
-        hr = pCMergedFolder_Constructor(IID_PPV_ARG(IAugmentedShellFolder, &pasf));
-    }
-    else
-    {
-        hr = E_FAIL;
-    }
-#else
-    hr = CoCreateInstance(CLSID_MergedFolder, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARG(IAugmentedShellFolder, &pasf));
-#endif
+    hr = CMergedFolder_CreateInstance(IID_PPV_ARG(IAugmentedShellFolder, &pasf));
     if (FAILED_UNEXPECTEDLY(hr))
     {
         *ppsfFavorites = psfUserFavorites.Detach();
@@ -560,30 +499,7 @@ HRESULT STDMETHODCALLTYPE CMenuCallback::GetObject(LPSMDATA psmd, REFIID riid, v
 
     if (fFavoritesMenu.p == NULL)
     {
-#if USE_CUSTOM_MENUBAND
-        if (!hRShell)
-        {
-            hRShell = GetModuleHandle(L"rshell.dll");
-            if (!hRShell)
-                hRShell = LoadLibrary(L"rshell.dll");
-        }
-
-        if (!pCMenuBand_Constructor)
-            pCMenuBand_Constructor = (PMENUBAND_CONSTRUCTOR) GetProcAddress(hRShell, "CMenuBand_Constructor");
-
-        if (pCMenuBand_Constructor)
-        {
-            hResult = pCMenuBand_Constructor(IID_PPV_ARG(IShellMenu, &newMenu));
-        }
-        else
-        {
-            hResult = CoCreateInstance(CLSID_MenuBand, NULL, CLSCTX_INPROC_SERVER,
-                IID_PPV_ARG(IShellMenu, &newMenu));
-        }
-#else
-        hResult = CoCreateInstance(CLSID_MenuBand, NULL, CLSCTX_INPROC_SERVER,
-            IID_PPV_ARG(IShellMenu, &newMenu));
-#endif
+        hResult = CMenuBand_CreateInstance(IID_PPV_ARG(IShellMenu, &newMenu));
         if (FAILED_UNEXPECTEDLY(hResult))
             return hResult;
         hResult = newMenu->Initialize(this, FCIDM_MENU_FAVORITES, -1, SMINIT_VERTICAL | SMINIT_CACHED);
@@ -730,9 +646,9 @@ HRESULT CInternetToolbar::ReserveBorderSpace(LONG maxHeight)
     if (FAILED_UNEXPECTEDLY(hResult))
         return hResult;
 
-    if (availableBorderSpace.top > maxHeight)
+    if (maxHeight && availableBorderSpace.bottom - availableBorderSpace.top > maxHeight)
     {
-        availableBorderSpace.top = maxHeight;
+        availableBorderSpace.bottom = availableBorderSpace.top + maxHeight;
     }
 
     return ResizeBorderDW(&availableBorderSpace, fSite, FALSE);
@@ -751,29 +667,9 @@ HRESULT CInternetToolbar::CreateMenuBar(IShellMenu **pMenuBar)
 
     *pMenuBar = NULL;
 
-    hResult = E_FAIL;
-#if USE_CUSTOM_MENUBAND
-    if (!g_hRShell) g_hRShell = GetModuleHandleW(L"rshell.dll");
-    
-    if (!g_hRShell) g_hRShell = LoadLibraryW(L"rshell.dll");
-
-    if (g_hRShell)
-    {
-        PMENUBAND_CONSTRUCTOR func = (PMENUBAND_CONSTRUCTOR) GetProcAddress(g_hRShell, "CMenuBand_Constructor");
-        if (func)
-        {
-            hResult = func(IID_PPV_ARG(IShellMenu, &menubar));
-        }
-    }
-#endif
-
+    hResult = CMenuBand_CreateInstance(IID_PPV_ARG(IShellMenu, &menubar));
     if (FAILED_UNEXPECTEDLY(hResult))
-    {
-        hResult = CoCreateInstance(CLSID_MenuBand, NULL, CLSCTX_INPROC_SERVER,
-            IID_PPV_ARG(IShellMenu, &menubar));
-        if (FAILED_UNEXPECTEDLY(hResult))
-            return hResult;
-    }
+        return hResult;
     
     hResult = fMenuCallback->QueryInterface(IID_PPV_ARG(IShellMenuCallback, &callback));
     if (FAILED_UNEXPECTEDLY(hResult))
@@ -819,29 +715,6 @@ HRESULT CInternetToolbar::CreateMenuBar(IShellMenu **pMenuBar)
     return S_OK;
 }
 
-HRESULT CInternetToolbar::CreateBrandBand(IUnknown **logoBar)
-{
-#if 1
-    return ::CreateBrandBand(IID_PPV_ARG(IUnknown, logoBar));
-#else
-    return CoCreateInstance(CLSID_BrandBand, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARG(IUnknown, logoBar));
-#endif
-}
-
-HRESULT CInternetToolbar::CreateToolsBar(IUnknown **toolsBar)
-{
-    return ::CreateToolsBar(IID_PPV_ARG(IUnknown, toolsBar));
-}
-
-HRESULT CInternetToolbar::CreateAddressBand(IUnknown **toolsBar)
-{
-#if 1
-    return ::CreateAddressBand(IID_PPV_ARG(IUnknown, toolsBar));
-#else
-    return CoCreateInstance(CLSID_SH_AddressBand, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARG(IUnknown, toolsBar));
-#endif
-}
-
 HRESULT CInternetToolbar::LockUnlockToolbars(bool locked)
 {
     REBARBANDINFOW                          rebarBandInfo;
@@ -869,7 +742,7 @@ HRESULT CInternetToolbar::LockUnlockToolbars(bool locked)
                 SendMessage(fMainReBar, RB_SETBANDINFOW, x, (LPARAM)&rebarBandInfo);
             }
         }
-        hResult = ReserveBorderSpace();
+        hResult = ReserveBorderSpace(0);
 
         // TODO: refresh view menu?
     }
@@ -898,6 +771,10 @@ HRESULT CInternetToolbar::CommandStateChanged(bool newValue, int commandID)
             // back
             hResult = SetState(&CLSID_CommonButtons, IDM_GOTO_BACK, newValue ? TBSTATE_ENABLED : 0);
             break;
+        case 3:
+            // up
+            hResult = SetState(&CLSID_CommonButtons, IDM_GOTO_UPONELEVEL, newValue ? TBSTATE_ENABLED : 0);
+            break;
     }
     return hResult;
 }
@@ -913,7 +790,7 @@ HRESULT CInternetToolbar::CreateAndInitBandProxy()
     hResult = serviceProvider->QueryService(SID_IBandProxy, IID_PPV_ARG(IBandProxy, &fBandProxy));
     if (FAILED_UNEXPECTEDLY(hResult))
     {
-        hResult = CreateBandProxy(IID_PPV_ARG(IBandProxy, &fBandProxy));
+        hResult = CBandProxy_CreateInstance(IID_PPV_ARG(IBandProxy, &fBandProxy));
         if (FAILED_UNEXPECTEDLY(hResult))
             return hResult;
         hResult = fBandProxy->SetSite(fSite);
@@ -1057,6 +934,8 @@ HRESULT STDMETHODCALLTYPE CInternetToolbar::CloseDW(DWORD dwReserved)
             return hResult;
         ReleaseCComPtrExpectZero(fLogoBar);
     }
+
+    SetSite(NULL);
     return S_OK;
 }
 
@@ -1070,7 +949,7 @@ HRESULT STDMETHODCALLTYPE CInternetToolbar::ResizeBorderDW(LPCRECT prcBorder,
 
     // RBSTR_CHANGERECT does not seem to set the proper size in the rect.
     // Let's make sure we fetch the actual size properly.
-    GetWindowRect(fMainReBar, &availableBorderSpace);
+    ::GetWindowRect(fMainReBar, &availableBorderSpace);
     neededBorderSpace.left = 0;
     neededBorderSpace.top = availableBorderSpace.bottom - availableBorderSpace.top;
     if (!fLocked)
@@ -1144,7 +1023,7 @@ HRESULT STDMETHODCALLTYPE CInternetToolbar::InitNew()
     // and it will put them in their own row, sized to take up the whole row.
 #if 0
     /* Create and attach the brand/logo to the rebar */
-    hResult = CreateBrandBand(&logoBar);
+    hResult = CBrandBand_CreateInstance(IID_PPV_ARG(IUnknown, &logoBar));
     if (FAILED_UNEXPECTEDLY(hResult))
         return hResult;
     AddDockItem(logoBar, ITBBID_BRANDBAND, CDockSite::ITF_NOGRIPPER | CDockSite::ITF_NOTITLE | CDockSite::ITF_FIXEDSIZE);
@@ -1152,7 +1031,7 @@ HRESULT STDMETHODCALLTYPE CInternetToolbar::InitNew()
 #endif
 
     /* Create and attach the standard toolbar to the rebar */
-    hResult = CreateToolsBar(&toolsBar);
+    hResult = CToolsBand_CreateInstance(IID_PPV_ARG(IUnknown, &toolsBar));
     if (FAILED_UNEXPECTEDLY(hResult))
         return hResult;
     AddDockItem(toolsBar, ITBBID_TOOLSBAND, CDockSite::ITF_NOTITLE | CDockSite::ITF_NEWBANDALWAYS | CDockSite::ITF_GRIPPERALWAYS);
@@ -1162,7 +1041,7 @@ HRESULT STDMETHODCALLTYPE CInternetToolbar::InitNew()
         return hResult;
 
     /* Create and attach the address/navigation toolbar to the rebar */
-    hResult = CreateAddressBand(&navigationBar);
+    hResult = CAddressBand_CreateInstance(IID_PPV_ARG(IUnknown, &navigationBar));
     if (FAILED_UNEXPECTEDLY(hResult))
         return hResult;
     AddDockItem(navigationBar, ITBBID_ADDRESSBAND, CDockSite::ITF_NEWBANDALWAYS | CDockSite::ITF_GRIPPERALWAYS);
@@ -1403,8 +1282,6 @@ HRESULT STDMETHODCALLTYPE CInternetToolbar::OnChange(LONG lEvent, LPCITEMIDLIST
 HRESULT STDMETHODCALLTYPE CInternetToolbar::SetSite(IUnknown *pUnkSite)
 {
     CComPtr<IBrowserService>                browserService;
-    CComPtr<IServiceProvider>               serviceProvider;
-    CComPtr<IOleWindow>                     oleWindow;
     HWND                                    ownerWindow;
     HWND                                    dockContainer;
     HRESULT                                 hResult;
@@ -1419,10 +1296,7 @@ HRESULT STDMETHODCALLTYPE CInternetToolbar::SetSite(IUnknown *pUnkSite)
     else
     {
         // get window handle of owner
-        hResult = pUnkSite->QueryInterface(IID_PPV_ARG(IOleWindow, &oleWindow));
-        if (FAILED_UNEXPECTEDLY(hResult))
-            return hResult;
-        hResult = oleWindow->GetWindow(&ownerWindow);
+        hResult = IUnknown_GetWindow(pUnkSite, &ownerWindow);
         if (FAILED_UNEXPECTEDLY(hResult))
             return hResult;
         if (ownerWindow == NULL)
@@ -1447,9 +1321,7 @@ HRESULT STDMETHODCALLTYPE CInternetToolbar::SetSite(IUnknown *pUnkSite)
             return E_FAIL;
 
         // take advice to watch events
-        hResult = pUnkSite->QueryInterface(IID_PPV_ARG(IServiceProvider, &serviceProvider));
-        hResult = serviceProvider->QueryService(
-            SID_SShellBrowser, IID_PPV_ARG(IBrowserService, &browserService));
+        hResult = IUnknown_QueryService(pUnkSite, SID_SShellBrowser, IID_PPV_ARG(IBrowserService, &browserService));
         hResult = AtlAdvise(browserService, static_cast<IDispatch *>(this), DIID_DWebBrowserEvents, &fAdviseCookie);
     }
     return S_OK;
@@ -1467,7 +1339,6 @@ HRESULT STDMETHODCALLTYPE CInternetToolbar::GetSite(REFIID riid, void **ppvSite)
 
 HRESULT STDMETHODCALLTYPE CInternetToolbar::QueryService(REFGUID guidService, REFIID riid, void **ppvObject)
 {
-    CComPtr<IServiceProvider>               serviceProvider;
     HRESULT                                 hResult;
 
     if (IsEqualIID(guidService, IID_IBandSite))
@@ -1577,15 +1448,10 @@ HRESULT STDMETHODCALLTYPE CInternetToolbar::GetBandSiteInfo(BANDSITEINFO *pbsinf
 
 LRESULT CInternetToolbar::OnTravelBack(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
 {
-    CComPtr<IServiceProvider>               serviceProvider;
     CComPtr<IWebBrowser>                    webBrowser;
     HRESULT                                 hResult;
 
-    hResult = fSite->QueryInterface(IID_PPV_ARG(IServiceProvider, &serviceProvider));
-    if (FAILED_UNEXPECTEDLY(hResult))
-        return 0;
-    hResult = serviceProvider->QueryService(SID_SShellBrowser,
-        IID_PPV_ARG(IWebBrowser, &webBrowser));
+    hResult = IUnknown_QueryService(fSite, SID_SShellBrowser, IID_PPV_ARG(IWebBrowser, &webBrowser));
     if (FAILED_UNEXPECTEDLY(hResult))
         return 0;
     hResult = webBrowser->GoBack();
@@ -1594,15 +1460,10 @@ LRESULT CInternetToolbar::OnTravelBack(WORD wNotifyCode, WORD wID, HWND hWndCtl,
 
 LRESULT CInternetToolbar::OnTravelForward(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
 {
-    CComPtr<IServiceProvider>               serviceProvider;
     CComPtr<IWebBrowser>                    webBrowser;
     HRESULT                                 hResult;
 
-    hResult = fSite->QueryInterface(IID_PPV_ARG(IServiceProvider, &serviceProvider));
-    if (FAILED_UNEXPECTEDLY(hResult))
-        return 0;
-    hResult = serviceProvider->QueryService(
-        SID_SShellBrowser, IID_PPV_ARG(IWebBrowser, &webBrowser));
+    hResult = IUnknown_QueryService(fSite, SID_SShellBrowser, IID_PPV_ARG(IWebBrowser, &webBrowser));
     if (FAILED_UNEXPECTEDLY(hResult))
         return 0;
     hResult = webBrowser->GoForward();
@@ -1611,56 +1472,18 @@ LRESULT CInternetToolbar::OnTravelForward(WORD wNotifyCode, WORD wID, HWND hWndC
 
 LRESULT CInternetToolbar::OnUpLevel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
 {
-    CComPtr<IOleCommandTarget>              oleCommandTarget;
-    HRESULT                                 hResult;
-
-    hResult = fSite->QueryInterface(IID_PPV_ARG(IOleCommandTarget, &oleCommandTarget));
-    if (FAILED_UNEXPECTEDLY(hResult))
-        return hResult;
-    hResult = oleCommandTarget->Exec(&CGID_ShellBrowser, IDM_GOTO_UPONELEVEL, 0, NULL, NULL);
+    IUnknown_Exec(fSite, CGID_ShellBrowser, IDM_GOTO_UPONELEVEL, 0, NULL, NULL);
     return 1;
 }
 
 LRESULT CInternetToolbar::OnSearch(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
 {
-    CComPtr<IObjectWithSite>                objectWithSite;
-    CComPtr<IContextMenu>                   contextMenu;
-    CMINVOKECOMMANDINFO                     commandInfo;
-    const char                              *searchGUID = "{169A0691-8DF9-11d1-A1C4-00C04FD75D13}";
-    HRESULT                                 hResult;
-
-    // TODO: Query shell if this command is enabled first
-
-    memset(&commandInfo, 0, sizeof(commandInfo));
-    commandInfo.cbSize = sizeof(commandInfo);
-    commandInfo.hwnd = m_hWnd;
-    commandInfo.lpParameters = searchGUID;
-    commandInfo.nShow = SW_SHOWNORMAL;
-
-    hResult = CoCreateInstance(CLSID_ShellSearchExt, NULL, CLSCTX_INPROC_SERVER,
-        IID_PPV_ARG(IContextMenu, &contextMenu));
-    if (FAILED_UNEXPECTEDLY(hResult))
-        return 0;
-    hResult = contextMenu->QueryInterface(IID_PPV_ARG(IObjectWithSite, &objectWithSite));
-    if (FAILED_UNEXPECTEDLY(hResult))
-        return 0;
-    hResult = objectWithSite->SetSite(fSite);
-    if (FAILED_UNEXPECTEDLY(hResult))
-        return 0;
-    hResult = contextMenu->InvokeCommand(&commandInfo);
-    hResult = objectWithSite->SetSite(NULL);
-    return 0;
+    return IUnknown_Exec(fSite, CLSID_CommonButtons, 0x123, 1, NULL, NULL); 
 }
 
 LRESULT CInternetToolbar::OnFolders(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
 {
-    CComPtr<IOleCommandTarget>              oleCommandTarget;
-    HRESULT                                 hResult;
-
-    hResult = fSite->QueryInterface(IID_PPV_ARG(IOleCommandTarget, &oleCommandTarget));
-    if (FAILED_UNEXPECTEDLY(hResult))
-        return hResult;
-    hResult = oleCommandTarget->Exec(&CGID_Explorer, 0x23, 0, NULL, NULL);
+    IUnknown_Exec(fSite, CGID_Explorer, 0x23, 0, NULL, NULL);
     return 1;
 }
 
@@ -1677,7 +1500,6 @@ LRESULT CInternetToolbar::OnForwardToCommandTarget(WORD wNotifyCode, WORD wID, H
 
 LRESULT CInternetToolbar::OnMenuDropDown(UINT idControl, NMHDR *pNMHDR, BOOL &bHandled)
 {
-    CComPtr<IServiceProvider>               serviceProvider;
     CComPtr<IBrowserService>                browserService;
     CComPtr<IOleCommandTarget>              commandTarget;
     CComPtr<ITravelLog>                     travelLog;
@@ -1689,6 +1511,7 @@ LRESULT CInternetToolbar::OnMenuDropDown(UINT idControl, NMHDR *pNMHDR, BOOL &bH
     VARIANT                                 parmIn;
     OLECMD                                  commandInfo;
     HRESULT                                 hResult;
+    wchar_t                                 templateString[200];
 
     notifyInfo = (NMTOOLBARW *)pNMHDR;
     if (notifyInfo->hdr.hwndFrom != fToolbarWindow)
@@ -1703,21 +1526,23 @@ LRESULT CInternetToolbar::OnMenuDropDown(UINT idControl, NMHDR *pNMHDR, BOOL &bH
     {
         case IDM_GOTO_BACK:
             newMenu = CreatePopupMenu();
-            hResult = fSite->QueryInterface(IID_PPV_ARG(IServiceProvider, &serviceProvider));
-            hResult = serviceProvider->QueryService(
-                SID_SShellBrowser, IID_PPV_ARG(IBrowserService, &browserService));
+            hResult = IUnknown_QueryService(fSite, SID_SShellBrowser, IID_PPV_ARG(IBrowserService, &browserService));
             hResult = browserService->GetTravelLog(&travelLog);
             hResult = travelLog->InsertMenuEntries(browserService, newMenu, 0, 1, 9, TLMENUF_BACK);
-            hResult = browserService->QueryInterface(IID_PPV_ARG(IOleCommandTarget, &commandTarget));
             commandInfo.cmdID = 0x1d;
-            hResult = commandTarget->QueryStatus(&CGID_Explorer, 1, &commandInfo, NULL);
+            hResult = IUnknown_QueryStatus(browserService, CGID_Explorer, 1, &commandInfo, NULL);
             if ((commandInfo.cmdf & (OLECMDF_ENABLED | OLECMDF_LATCHED)) == OLECMDF_ENABLED &&
                 travelLog->CountEntries(browserService) > 1)
             {
-                AppendMenu(newMenu, MF_SEPARATOR, -1, L"");
-                AppendMenu(newMenu, MF_STRING /* | MF_OWNERDRAW */, IDM_EXPLORERBAR_HISTORY, L"&History\tCtrl+H");
+                AppendMenuW(newMenu, MF_SEPARATOR, -1, L"");
+
+                if (LoadStringW(_AtlBaseModule.GetResourceInstance(),
+                                IDS_HISTORYTEXT, templateString, sizeof(templateString) / sizeof(wchar_t)) == 0)
+                    StringCbCopyW(templateString, sizeof(templateString), L"&History\tCtrl+H");
+
+                AppendMenuW(newMenu, MF_STRING /* | MF_OWNERDRAW */, IDM_EXPLORERBAR_HISTORY, templateString);
             }
-            params.cbSize = sizeof (params);
+            params.cbSize = sizeof(params);
             params.rcExclude = bounds;
             selectedItem = TrackPopupMenuEx(newMenu, TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RETURNCMD,
                                     bounds.left, bounds.bottom, m_hWnd, &params);
@@ -1733,20 +1558,23 @@ LRESULT CInternetToolbar::OnMenuDropDown(UINT idControl, NMHDR *pNMHDR, BOOL &bH
             break;
         case IDM_GOTO_FORWARD:
             newMenu = CreatePopupMenu();
-            hResult = fSite->QueryInterface(IID_PPV_ARG(IServiceProvider, &serviceProvider));
-            hResult = serviceProvider->QueryService(SID_SShellBrowser, IID_PPV_ARG(IBrowserService, &browserService));
+            hResult = IUnknown_QueryService(fSite, SID_SShellBrowser, IID_PPV_ARG(IBrowserService, &browserService));
             hResult = browserService->GetTravelLog(&travelLog);
             hResult = travelLog->InsertMenuEntries(browserService, newMenu, 0, 1, 9, TLMENUF_FORE);
-            hResult = browserService->QueryInterface(IID_PPV_ARG(IOleCommandTarget, &commandTarget));
             commandInfo.cmdID = 0x1d;
-            hResult = commandTarget->QueryStatus(&CGID_Explorer, 1, &commandInfo, NULL);
+            hResult = IUnknown_QueryStatus(browserService, CGID_Explorer, 1, &commandInfo, NULL);
             if ((commandInfo.cmdf & (OLECMDF_ENABLED | OLECMDF_LATCHED)) == OLECMDF_ENABLED &&
                 travelLog->CountEntries(browserService) > 1)
             {
-                AppendMenu(newMenu, MF_SEPARATOR, -1, L"");
-                AppendMenu(newMenu, MF_STRING /* | MF_OWNERDRAW */, IDM_EXPLORERBAR_HISTORY, L"&History\tCtrl+H");
+                AppendMenuW(newMenu, MF_SEPARATOR, -1, L"");
+
+                if (LoadStringW(_AtlBaseModule.GetResourceInstance(),
+                                IDS_HISTORYTEXT, templateString, sizeof(templateString) / sizeof(wchar_t)) == 0)
+                    StringCbCopyW(templateString, sizeof(templateString), L"&History\tCtrl+H");
+
+                AppendMenuW(newMenu, MF_STRING /* | MF_OWNERDRAW */, IDM_EXPLORERBAR_HISTORY, templateString);
             }
-            params.cbSize = sizeof (params);
+            params.cbSize = sizeof(params);
             params.rcExclude = bounds;
             selectedItem = TrackPopupMenuEx(newMenu, TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RETURNCMD,
                                     bounds.left, bounds.bottom, m_hWnd, &params);
@@ -1757,7 +1585,7 @@ LRESULT CInternetToolbar::OnMenuDropDown(UINT idControl, NMHDR *pNMHDR, BOOL &bH
                 Exec(&CGID_Explorer, 0x1d, 2, &parmIn, NULL);
             }
             else if (selectedItem != 0)
-                hResult = travelLog->Travel(browserService, -selectedItem);
+                hResult = travelLog->Travel(browserService, selectedItem);
             DestroyMenu(newMenu);
             break;
         case gViewsCommandID:
@@ -1795,6 +1623,7 @@ LRESULT CInternetToolbar::OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam,
     RBHITTESTINFO                           hitTestInfo;
     REBARBANDINFOW                          rebarBandInfo;
     int                                     bandID;
+    BOOL                                    goButtonChecked;
 
     clickLocation.x = LOWORD(lParam);
     clickLocation.y = HIWORD(lParam);
@@ -1844,6 +1673,8 @@ LRESULT CInternetToolbar::OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam,
     SHCheckMenuItem(contextMenu, IDM_TOOLBARS_LINKSBAR, FALSE);
     SHCheckMenuItem(contextMenu, IDM_TOOLBARS_CUSTOMIZE, FALSE);
     SHCheckMenuItem(contextMenu, IDM_TOOLBARS_LOCKTOOLBARS, fLocked);
+    goButtonChecked = SHRegGetBoolUSValueW(L"Software\\Microsoft\\Internet Explorer\\Main", L"ShowGoButton", FALSE, TRUE);
+    SHCheckMenuItem(contextMenu, IDM_TOOLBARS_GOBUTTON, goButtonChecked);
 
     // TODO: use GetSystemMetrics(SM_MENUDROPALIGNMENT) to determine menu alignment
     command = TrackPopupMenu(contextMenu, TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD,
@@ -1862,6 +1693,9 @@ LRESULT CInternetToolbar::OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam,
         case IDM_TOOLBARS_CUSTOMIZE:    // customize
             SendMessage(fToolbarWindow, TB_CUSTOMIZE, 0, 0);
             break;
+        case IDM_TOOLBARS_GOBUTTON:
+            SendMessage(fNavigationWindow, WM_COMMAND, IDM_TOOLBARS_GOBUTTON, 0);
+            break;
     }
 
     DestroyMenu(contextMenuBar);
@@ -1895,8 +1729,8 @@ LRESULT CInternetToolbar::OnTipText(UINT idControl, NMHDR *pNMHDR, BOOL &bHandle
     CComPtr<ITravelLog>                     travelLog;
     TOOLTIPTEXTW                            *pTTTW;
     UINT                                    nID;
-    wchar_t                                 tempString[300];
     HRESULT                                 hResult;
+    wchar_t                                 tempString[300];
 
     pTTTW = reinterpret_cast<TOOLTIPTEXTW *>(pNMHDR);
     if ((pTTTW->uFlags & TTF_IDISHWND) != 0)
@@ -1922,7 +1756,7 @@ LRESULT CInternetToolbar::OnTipText(UINT idControl, NMHDR *pNMHDR, BOOL &bHandle
         }
         else
             tempString[0] = 0;
-        wcsncpy (pTTTW->szText, tempString, sizeof (pTTTW->szText) / sizeof (wchar_t));
+        wcsncpy (pTTTW->szText, tempString, sizeof(pTTTW->szText) / sizeof(wchar_t));
         ::SetWindowPos(pNMHDR->hwndFrom, HWND_TOP, 0, 0, 0, 0,
             SWP_NOOWNERZORDER | SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);
         return 0;
@@ -1973,7 +1807,7 @@ LRESULT CInternetToolbar::OnLDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL
     fStartPosition.y = GET_Y_LPARAM(msgp);
     
     RECT rc;
-    GetWindowRect(m_hWnd, &rc);
+    GetWindowRect(&rc);
 
     fStartHeight = rc.bottom - rc.top;
 
@@ -2016,7 +1850,3 @@ LRESULT CInternetToolbar::OnLUp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &b
     return 0;
 }
 
-HRESULT CreateInternetToolbar(REFIID riid, void **ppv)
-{
-    return ShellObjectCreator<CInternetToolbar>(riid, ppv);
-}