Alexander Nicolaysen Sørnes : shdocvw: Add Favorites menu to IE.
Alexandre Julliard
julliard at winehq.org
Mon Aug 2 11:03:53 CDT 2010
Module: wine
Branch: master
Commit: 8156323404017353d3114879896a70f1873e65a8
URL: http://source.winehq.org/git/wine.git/?a=commit;h=8156323404017353d3114879896a70f1873e65a8
Author: Alexander Nicolaysen Sørnes <alex at 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;
};
More information about the wine-cvs
mailing list