From a91bb52c6980a05720f1bb9ea60b153bff2a0955 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20Nicolaysen=20S=C3=B8rnes?= Date: Thu, 29 Jul 2010 12:12:54 +0200 Subject: [PATCH] shdocvw: Allow navigating to Favorites in IE. --- dlls/shdocvw/iexplore.c | 74 ++++++++++++++++++++++++++++++++++++++--- dlls/shdocvw/resource.h | 3 ++ 2 files changed, 73 insertions(+), 4 deletions(-) diff --git a/dlls/shdocvw/iexplore.c b/dlls/shdocvw/iexplore.c index f22dcd5831d..bef25ab6a95 100644 --- a/dlls/shdocvw/iexplore.c +++ b/dlls/shdocvw/iexplore.c @@ -83,15 +83,55 @@ static HMENU get_fav_menu(HMENU menu) return GetSubMenu(menu, 1); } -static void add_fav_to_menu(HMENU menu, LPWSTR title) +static LPCWSTR get_fav_url_from_id(HMENU menu, UINT id) { MENUITEMINFOW item; item.cbSize = sizeof(item); - item.fMask = MIIM_FTYPE | MIIM_STRING; + item.fMask = MIIM_DATA; + + if(!GetMenuItemInfoW(menu, id, FALSE, &item)) + return NULL; + + return (LPWSTR)item.dwItemData; +} + +static void free_fav_menu_data(HMENU menu) +{ + LPCWSTR url; + int i; + + for(i = 0; (url = get_fav_url_from_id(menu, ID_BROWSE_GOTOFAV_FIRST + i)); i++) + heap_free((LPWSTR)url); +} + +static void add_fav_to_menu(HMENU menu, LPWSTR title, LPCWSTR url) +{ + MENUITEMINFOW item; + /* Subtract the number of standard elements in the Favorites menu */ + INT favcount = GetMenuItemCount(menu) - 2; + LPWSTR urlbuf; + + if(favcount > (ID_BROWSE_GOTOFAV_MAX - ID_BROWSE_GOTOFAV_FIRST)) + { + FIXME("Add support for more than %d Favorites\n", favcount); + return; + } + + urlbuf = heap_alloc((lstrlenW(url) + 1) * sizeof(WCHAR)); + + if(!urlbuf) + return; + + lstrcpyW(urlbuf, url); + + item.cbSize = sizeof(item); + item.fMask = MIIM_FTYPE | MIIM_STRING | MIIM_DATA | MIIM_ID; item.fType = MFT_STRING; item.dwTypeData = title; - InsertMenuItemW(menu, GetMenuItemCount(menu), TRUE, &item); + item.wID = ID_BROWSE_GOTOFAV_FIRST + favcount; + item.dwItemData = (ULONG_PTR)urlbuf; + InsertMenuItemW(menu, favcount + 2, TRUE, &item); } static void add_favs_to_menu(HMENU menu, LPCWSTR dir) @@ -125,14 +165,20 @@ static void add_favs_to_menu(HMENU menu, LPCWSTR dir) do { WCHAR* fileext; + WCHAR* url = NULL; lstrcpyW(filename, finddata.cFileName); if(FAILED(IPersistFile_Load(urlfile, path, 0))) continue; + urlobj->lpVtbl->GetURL(urlobj, &url); + + if(!url) + continue; + fileext = filename + lstrlenW(filename) - lstrlenW(urlext) + 1; *fileext = 0; - add_fav_to_menu(menu, filename); + add_fav_to_menu(menu, filename, url); } while(FindNextFileW(findhandle, &finddata)); } @@ -159,6 +205,18 @@ static HMENU create_ie_menu(void) return menu; } +static void ie_navigate(InternetExplorer* This, LPCWSTR url) +{ + VARIANT variant; + + V_VT(&variant) = VT_BSTR; + V_BSTR(&variant) = SysAllocString(url); + + IWebBrowser2_Navigate2(WEBBROWSER2(This), &variant, NULL, NULL, NULL, NULL); + + SysFreeString(V_BSTR(&variant)); +} + static INT_PTR CALLBACK ie_dialog_open_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { static InternetExplorer* This; @@ -310,6 +368,7 @@ static LRESULT iewnd_OnDestroy(InternetExplorer *This) { TRACE("%p\n", This); + free_fav_menu_data(get_fav_menu(This->menu)); This->frame_hwnd = NULL; PostQuitMessage(0); /* FIXME */ @@ -343,6 +402,13 @@ static LRESULT CALLBACK iewnd_OnCommand(InternetExplorer *This, HWND hwnd, UINT break; default: + if(LOWORD(wparam) >= ID_BROWSE_GOTOFAV_FIRST && LOWORD(wparam) <= ID_BROWSE_GOTOFAV_MAX) + { + LPCWSTR url = get_fav_url_from_id(get_fav_menu(This->menu), LOWORD(wparam)); + + if(url) + ie_navigate(This, url); + } return DefWindowProcW(hwnd, msg, wparam, lparam); } return 0; diff --git a/dlls/shdocvw/resource.h b/dlls/shdocvw/resource.h index 5e7f45dd26d..898703cd057 100644 --- a/dlls/shdocvw/resource.h +++ b/dlls/shdocvw/resource.h @@ -39,3 +39,6 @@ #define ID_BROWSE_ABOUT 336 #define ID_BROWSE_ADDFAV 1200 + +#define ID_BROWSE_GOTOFAV_FIRST 2000 +#define ID_BROWSE_GOTOFAV_MAX 65000