Alexander Nicolaysen Sørnes : shdocvw: Recurse into directories when adding Favorite in IE.
Alexandre Julliard
julliard at winehq.org
Tue Aug 3 13:10:36 CDT 2010
Module: wine
Branch: master
Commit: abc1e565636a1749c983cda28fe98dd4cf1acde8
URL: http://source.winehq.org/git/wine.git/?a=commit;h=abc1e565636a1749c983cda28fe98dd4cf1acde8
Author: Alexander Nicolaysen Sørnes <alex at thehandofagony.com>
Date: Thu Jul 22 18:12:02 2010 +0200
shdocvw: Recurse into directories when adding Favorite in IE.
---
dlls/shdocvw/iexplore.c | 88 +++++++++++++++++++++++++++++++++++------------
1 files changed, 66 insertions(+), 22 deletions(-)
diff --git a/dlls/shdocvw/iexplore.c b/dlls/shdocvw/iexplore.c
index b794a8b..c934753 100644
--- a/dlls/shdocvw/iexplore.c
+++ b/dlls/shdocvw/iexplore.c
@@ -105,11 +105,31 @@ static void free_fav_menu_data(HMENU menu)
heap_free((LPWSTR)url);
}
-static void add_fav_to_menu(HMENU menu, LPWSTR title, LPCWSTR url)
+static int get_menu_item_count(HMENU menu)
+{
+ MENUITEMINFOW item;
+ int count = 0;
+ int i;
+
+ item.cbSize = sizeof(item);
+ item.fMask = MIIM_DATA | MIIM_SUBMENU;
+
+ for(i = 0; GetMenuItemInfoW(menu, i, TRUE, &item); i++)
+ {
+ if(item.hSubMenu)
+ count += get_menu_item_count(item.hSubMenu);
+ else
+ count++;
+ }
+
+ return count;
+}
+
+static void add_fav_to_menu(HMENU favmenu, HMENU menu, LPWSTR title, LPCWSTR url)
{
MENUITEMINFOW item;
/* Subtract the number of standard elements in the Favorites menu */
- INT favcount = GetMenuItemCount(menu) - 2;
+ int favcount = get_menu_item_count(favmenu) - 2;
LPWSTR urlbuf;
if(favcount > (ID_BROWSE_GOTOFAV_MAX - ID_BROWSE_GOTOFAV_FIRST))
@@ -131,13 +151,13 @@ static void add_fav_to_menu(HMENU menu, LPWSTR title, LPCWSTR url)
item.dwTypeData = title;
item.wID = ID_BROWSE_GOTOFAV_FIRST + favcount;
item.dwItemData = (ULONG_PTR)urlbuf;
- InsertMenuItemW(menu, favcount + 2, TRUE, &item);
+ InsertMenuItemW(menu, -1, TRUE, &item);
}
-static void add_favs_to_menu(HMENU menu, LPCWSTR dir)
+static void add_favs_to_menu(HMENU favmenu, HMENU menu, LPCWSTR dir)
{
WCHAR path[MAX_PATH*2];
- const WCHAR urlext[] = {'*','.','u','r','l',0};
+ const WCHAR search[] = {'*',0};
WCHAR* filename;
HANDLE findhandle;
WIN32_FIND_DATAW finddata;
@@ -146,7 +166,7 @@ static void add_favs_to_menu(HMENU menu, LPCWSTR dir)
HRESULT res;
lstrcpyW(path, dir);
- PathAppendW(path, urlext);
+ PathAppendW(path, search);
findhandle = FindFirstFileW(path, &finddata);
@@ -160,25 +180,48 @@ static void add_favs_to_menu(HMENU menu, LPCWSTR dir)
if(SUCCEEDED(res))
{
- filename = path + lstrlenW(path) - lstrlenW(urlext);
+ filename = path + lstrlenW(path) - lstrlenW(search);
do
{
- WCHAR* fileext;
- WCHAR* url = NULL;
lstrcpyW(filename, finddata.cFileName);
- if(FAILED(IPersistFile_Load(urlfile, path, 0)))
- continue;
+ if(finddata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+ {
+ MENUITEMINFOW item;
+ const WCHAR ignore1[] = {'.','.',0};
+ const WCHAR ignore2[] = {'.',0};
+
+ if(!lstrcmpW(filename, ignore1) || !lstrcmpW(filename, ignore2))
+ continue;
+
+ item.cbSize = sizeof(item);
+ item.fMask = MIIM_STRING | MIIM_SUBMENU;
+ item.dwTypeData = filename;
+ item.hSubMenu = CreatePopupMenu();
+ InsertMenuItemW(menu, -1, TRUE, &item);
+ add_favs_to_menu(favmenu, item.hSubMenu, path);
+ } else
+ {
+ WCHAR* fileext;
+ WCHAR* url = NULL;
+ const WCHAR urlext[] = {'.','u','r','l',0};
+
+ if(lstrcmpiW(PathFindExtensionW(filename), urlext))
+ continue;
- urlobj->lpVtbl->GetURL(urlobj, &url);
+ if(FAILED(IPersistFile_Load(urlfile, path, 0)))
+ continue;
- if(!url)
- continue;
+ urlobj->lpVtbl->GetURL(urlobj, &url);
- fileext = filename + lstrlenW(filename) - lstrlenW(urlext) + 1;
- *fileext = 0;
- add_fav_to_menu(menu, filename, url);
+ if(!url)
+ continue;
+
+ fileext = filename + lstrlenW(filename) - lstrlenW(urlext);
+ *fileext = 0;
+ add_fav_to_menu(favmenu, menu, filename, url);
+ }
} while(FindNextFileW(findhandle, &finddata));
}
@@ -194,13 +237,14 @@ static void add_favs_to_menu(HMENU menu, LPCWSTR dir)
static HMENU create_ie_menu(void)
{
HMENU menu = LoadMenuW(shdocvw_hinstance, MAKEINTRESOURCEW(IDR_BROWSE_MAIN_MENU));
+ HMENU favmenu = get_fav_menu(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);
+ add_favs_to_menu(favmenu, favmenu, path);
if(SHGetFolderPathW(NULL, CSIDL_FAVORITES, NULL, SHGFP_TYPE_CURRENT, path) == S_OK)
- add_favs_to_menu(get_fav_menu(menu), path);
+ add_favs_to_menu(favmenu, favmenu, path);
return menu;
}
More information about the wine-cvs
mailing list