Module: wine Branch: master Commit: 8156323404017353d3114879896a70f1873e65a8 URL: http://source.winehq.org/git/wine.git/?a=commit;h=8156323404017353d311487989...
Author: Alexander Nicolaysen Sørnes alex@thehandofagony.com Date: Thu Jul 29 12:04:46 2010 +0200
shdocvw: Add Favorites menu to IE.
---
dlls/shdocvw/En.rc | 5 +++ dlls/shdocvw/ie.c | 10 +----- dlls/shdocvw/iexplore.c | 86 +++++++++++++++++++++++++++++++++++++++++++++++ dlls/shdocvw/resource.h | 2 + dlls/shdocvw/shdocvw.h | 1 + 5 files changed, 95 insertions(+), 9 deletions(-)
diff --git a/dlls/shdocvw/En.rc b/dlls/shdocvw/En.rc index 749c849..0c70851 100644 --- a/dlls/shdocvw/En.rc +++ b/dlls/shdocvw/En.rc @@ -50,6 +50,11 @@ IDR_BROWSE_MAIN_MENU MENU MENUITEM SEPARATOR MENUITEM "&Properties...", ID_BROWSE_PROPERTIES } + POPUP "&Favorites" + { + MENUITEM "&Add to Favorites..." ID_BROWSE_ADDFAV + MENUITEM SEPARATOR + } POPUP "&Help" { MENUITEM "&About Internet Explorer...", ID_BROWSE_ABOUT diff --git a/dlls/shdocvw/ie.c b/dlls/shdocvw/ie.c index 43afd31..2a048e3 100644 --- a/dlls/shdocvw/ie.c +++ b/dlls/shdocvw/ie.c @@ -430,19 +430,11 @@ static HRESULT WINAPI InternetExplorer_put_MenuBar(IWebBrowser2 *iface, VARIANT_
TRACE("(%p)->(%x)\n", This, Value);
- if((menu = GetMenu(This->frame_hwnd))) - DestroyMenu(menu); - - menu = NULL; - if(Value) - menu = LoadMenuW(shdocvw_hinstance, MAKEINTRESOURCEW(IDR_BROWSE_MAIN_MENU)); + menu = This->menu;
if(!SetMenu(This->frame_hwnd, menu)) - { - DestroyMenu(menu); return HRESULT_FROM_WIN32(GetLastError()); - }
return S_OK; } diff --git a/dlls/shdocvw/iexplore.c b/dlls/shdocvw/iexplore.c index 2f15987..f22dcd5 100644 --- a/dlls/shdocvw/iexplore.c +++ b/dlls/shdocvw/iexplore.c @@ -34,6 +34,9 @@ #include "shdocvw.h" #include "mshtmcid.h" #include "shellapi.h" +#include "winreg.h" +#include "shlwapi.h" +#include "intshcut.h"
#include "wine/debug.h"
@@ -75,6 +78,87 @@ void adjust_ie_docobj_rect(HWND frame, RECT* rc) } }
+static HMENU get_fav_menu(HMENU menu) +{ + return GetSubMenu(menu, 1); +} + +static void add_fav_to_menu(HMENU menu, LPWSTR title) +{ + MENUITEMINFOW item; + + item.cbSize = sizeof(item); + item.fMask = MIIM_FTYPE | MIIM_STRING; + item.fType = MFT_STRING; + item.dwTypeData = title; + InsertMenuItemW(menu, GetMenuItemCount(menu), TRUE, &item); +} + +static void add_favs_to_menu(HMENU menu, LPCWSTR dir) +{ + WCHAR path[MAX_PATH*2]; + const WCHAR urlext[] = {'*','.','u','r','l',0}; + WCHAR* filename; + HANDLE findhandle; + WIN32_FIND_DATAW finddata; + IUniformResourceLocatorW* urlobj; + IPersistFile* urlfile; + HRESULT res; + + lstrcpyW(path, dir); + PathAppendW(path, urlext); + + findhandle = FindFirstFileW(path, &finddata); + + if(findhandle == INVALID_HANDLE_VALUE) + return; + + res = CoCreateInstance(&CLSID_InternetShortcut, NULL, CLSCTX_INPROC_SERVER, &IID_IUniformResourceLocatorW, (PVOID*)&urlobj); + + if(SUCCEEDED(res)) + res = IUnknown_QueryInterface(urlobj, &IID_IPersistFile, (PVOID*)&urlfile); + + if(SUCCEEDED(res)) + { + filename = path + lstrlenW(path) - lstrlenW(urlext); + + do + { + WCHAR* fileext; + lstrcpyW(filename, finddata.cFileName); + + if(FAILED(IPersistFile_Load(urlfile, path, 0))) + continue; + + fileext = filename + lstrlenW(filename) - lstrlenW(urlext) + 1; + *fileext = 0; + add_fav_to_menu(menu, filename); + } while(FindNextFileW(findhandle, &finddata)); + } + + if(urlfile) + IPersistFile_Release(urlfile); + + if(urlobj) + IUnknown_Release(urlobj); + + FindClose(findhandle); +} + +static HMENU create_ie_menu(void) +{ + HMENU menu = LoadMenuW(shdocvw_hinstance, MAKEINTRESOURCEW(IDR_BROWSE_MAIN_MENU)); + WCHAR path[MAX_PATH]; + + if(SHGetFolderPathW(NULL, CSIDL_COMMON_FAVORITES, NULL, SHGFP_TYPE_CURRENT, path) == S_OK) + add_favs_to_menu(get_fav_menu(menu), path); + + if(SHGetFolderPathW(NULL, CSIDL_FAVORITES, NULL, SHGFP_TYPE_CURRENT, path) == S_OK) + add_favs_to_menu(get_fav_menu(menu), path); + + return menu; +} + static INT_PTR CALLBACK ie_dialog_open_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { static InternetExplorer* This; @@ -167,6 +251,8 @@ static LRESULT iewnd_OnCreate(HWND hwnd, LPCREATESTRUCTW lpcs) InternetExplorer* This = (InternetExplorer*)lpcs->lpCreateParams; SetWindowLongPtrW(hwnd, 0, (LONG_PTR) lpcs->lpCreateParams);
+ This->menu = create_ie_menu(); + This->status_hwnd = CreateStatusWindowW(CCS_NODIVIDER|WS_CHILD|WS_VISIBLE, NULL, hwnd, IDC_BROWSE_STATUSBAR); SendMessageW(This->status_hwnd, SB_SIMPLE, TRUE, 0);
diff --git a/dlls/shdocvw/resource.h b/dlls/shdocvw/resource.h index 91e9a11..5e7f45d 100644 --- a/dlls/shdocvw/resource.h +++ b/dlls/shdocvw/resource.h @@ -37,3 +37,5 @@ #define ID_BROWSE_PRINT_PREVIEW 277 #define ID_BROWSE_PROPERTIES 262 #define ID_BROWSE_ABOUT 336 + +#define ID_BROWSE_ADDFAV 1200 diff --git a/dlls/shdocvw/shdocvw.h b/dlls/shdocvw/shdocvw.h index d20e834..d45f559 100644 --- a/dlls/shdocvw/shdocvw.h +++ b/dlls/shdocvw/shdocvw.h @@ -190,6 +190,7 @@ struct InternetExplorer {
HWND frame_hwnd; HWND status_hwnd; + HMENU menu;
DocHost doc_host; };