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