From: Nikolay Sivov Subject: oledlg: Support convert menu item in OleUIAddVerbMenuW() Message-Id: <555C65E7.30503@codeweavers.com> Date: Wed, 20 May 2015 13:45:59 +0300 --- From 64bd75681e20173adb0af858a67c37e30a8eab03 Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Wed, 20 May 2015 13:44:45 +0300 Subject: [PATCH] oledlg: Support convert menu item in OleUIAddVerbMenuW() --- dlls/oledlg/oledlg.rc | 1 + dlls/oledlg/oledlg_main.c | 31 ++++++++++++++++++++----------- dlls/oledlg/resource.h | 1 + 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/dlls/oledlg/oledlg.rc b/dlls/oledlg/oledlg.rc index 18602db..9c1a818 100644 --- a/dlls/oledlg/oledlg.rc +++ b/dlls/oledlg/oledlg.rc @@ -30,6 +30,7 @@ STRINGTABLE IDS_NOTOLEMOD "File does not appear to be a valid OLE module. Unable to register OLE control." IDS_NOTOLEMODCAPTION "Add Control" IDS_VERBMENU_OBJECT "&Object" + IDS_VERBMENU_CONVERT "&Convert..." } STRINGTABLE diff --git a/dlls/oledlg/oledlg_main.c b/dlls/oledlg/oledlg_main.c index 41d10de..a1f4db4 100644 --- a/dlls/oledlg/oledlg_main.c +++ b/dlls/oledlg/oledlg_main.c @@ -163,15 +163,13 @@ BOOL WINAPI OleUIAddVerbMenuW(IOleObject *object, LPCWSTR shorttype, WCHAR *rootname, *objecttype; LPOLESTR usertype = NULL; OLEVERB firstverb, verb; - WCHAR objectW[32]; /* should be enough */ + WCHAR resstrW[32]; /* should be enough */ + BOOL singleverb; HMENU submenu; TRACE("(%p, %s, %p, %d, %d, %d, %d, %d, %p)\n", object, debugstr_w(shorttype), hMenu, uPos, idmin, idmax, addConvert, idConvert, ret_submenu); - if (addConvert) - FIXME("convert menu item is not supported.\n"); - if (ret_submenu) *ret_submenu = NULL; @@ -182,10 +180,10 @@ BOOL WINAPI OleUIAddVerbMenuW(IOleObject *object, LPCWSTR shorttype, if (object) IOleObject_EnumVerbs(object, &enumverbs); - LoadStringW(OLEDLG_hInstance, IDS_VERBMENU_OBJECT, objectW, sizeof(objectW)/sizeof(WCHAR)); + LoadStringW(OLEDLG_hInstance, IDS_VERBMENU_OBJECT, resstrW, sizeof(resstrW)/sizeof(WCHAR)); /* no object, or object without enumeration support */ if (!object || (object && !enumverbs)) { - InsertMenuW(hMenu, uPos, MF_BYPOSITION|MF_STRING|MF_GRAYED, idmin, objectW); + InsertMenuW(hMenu, uPos, MF_BYPOSITION|MF_STRING|MF_GRAYED, idmin, resstrW); return FALSE; } @@ -195,18 +193,19 @@ BOOL WINAPI OleUIAddVerbMenuW(IOleObject *object, LPCWSTR shorttype, else objecttype = (WCHAR*)shorttype; - rootname = CoTaskMemAlloc((strlenW(objecttype) + strlenW(objectW) + 2)*sizeof(WCHAR)); + rootname = CoTaskMemAlloc((strlenW(objecttype) + strlenW(resstrW) + 2)*sizeof(WCHAR)); strcpyW(rootname, objecttype); strcatW(rootname, spaceW); - strcatW(rootname, objectW); + strcatW(rootname, resstrW); CoTaskMemFree(usertype); /* iterate through verbs */ /* find first suitable verb */ get_next_insertable_verb(enumverbs, idmin, idmax, &firstverb); + singleverb = get_next_insertable_verb(enumverbs, idmin, idmax, &verb) != S_OK; - if (get_next_insertable_verb(enumverbs, idmin, idmax, &verb) != S_OK) { + if (singleverb && !addConvert) { WCHAR *str = CoTaskMemAlloc((strlenW(rootname) + strlenW(firstverb.lpszVerbName) + 2)*sizeof(WCHAR)); strcpyW(str, firstverb.lpszVerbName); @@ -224,15 +223,25 @@ BOOL WINAPI OleUIAddVerbMenuW(IOleObject *object, LPCWSTR shorttype, submenu = CreatePopupMenu(); insert_verb_to_menu(submenu, idmin, &firstverb); - insert_verb_to_menu(submenu, idmin, &verb); CoTaskMemFree(firstverb.lpszVerbName); - CoTaskMemFree(verb.lpszVerbName); + + if (!singleverb) { + insert_verb_to_menu(submenu, idmin, &verb); + CoTaskMemFree(verb.lpszVerbName); + } while (get_next_insertable_verb(enumverbs, idmin, idmax, &verb) == S_OK) { insert_verb_to_menu(submenu, idmin, &verb); CoTaskMemFree(verb.lpszVerbName); } + /* convert verb is at the bottom of a popup, separated from verbs */ + if (addConvert) { + LoadStringW(OLEDLG_hInstance, IDS_VERBMENU_CONVERT, resstrW, sizeof(resstrW)/sizeof(WCHAR)); + InsertMenuW(submenu, ~0, MF_BYPOSITION|MF_SEPARATOR, 0, NULL); + InsertMenuW(submenu, ~0, MF_BYPOSITION|MF_STRING, idConvert, resstrW); + } + if (submenu) *ret_submenu = submenu; diff --git a/dlls/oledlg/resource.h b/dlls/oledlg/resource.h index fe8df2e..04a757a 100644 --- a/dlls/oledlg/resource.h +++ b/dlls/oledlg/resource.h @@ -42,6 +42,7 @@ #define IDC_FILE 1011 /* String ids for verb menu */ +#define IDS_VERBMENU_CONVERT 0x130 #define IDS_VERBMENU_OBJECT 0x135 /* String ids for Paste Special */ -- 2.1.4