/*********************************************************************** * OleUIAddVerbMenuW (OLEDLG.14) */ BOOL WINAPI OleUIAddVerbMenuW(IOleObject *object, LPCWSTR shorttype, HMENU hMenu, UINT uPos, UINT idmin, UINT idmax, BOOL addConvert, UINT idConvert, HMENU *ret_submenu) { IEnumOLEVERB *enumverbs = NULL; LPOLESTR usertype = NULL; OLEVERB firstverb, verb; WCHAR *objecttype; WCHAR resstrW[32]; /* should be enough */ DWORD_PTR args[2]; BOOL singleverb; HMENU submenu; WCHAR *str; TRACE("(%p, %s, %p, %d, %d, %d, %d, %d, %p)\n", object, debugstr_w(shorttype), hMenu, uPos, idmin, idmax, addConvert, idConvert, ret_submenu); if (ret_submenu) *ret_submenu = NULL; if (!hMenu || !ret_submenu) return FALSE; /* check if we can get verbs at all */ if (object) IOleObject_EnumVerbs(object, &enumverbs); LoadStringW(OLEDLG_hInstance, IDS_VERBMENU_OBJECT, resstrW, sizeof(resstrW)/sizeof(WCHAR)); /* no object, or object without enumeration support */ if (!object || !enumverbs) { InsertMenuW(hMenu, uPos, MF_BYPOSITION|MF_STRING|MF_GRAYED, idmin, resstrW); return FALSE; } /* root entry string */ if (!shorttype && (IOleObject_GetUserType(object, USERCLASSTYPE_SHORT, &usertype) == S_OK)) objecttype = usertype; else objecttype = (WCHAR*)shorttype; /* 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 (singleverb && !addConvert) { LoadStringW(OLEDLG_hInstance, IDS_VERBMENU_SINGLEVERB_OBJECT, resstrW, sizeof(resstrW)/sizeof(WCHAR)); args[0] = (DWORD_PTR)firstverb.lpszVerbName; args[1] = (DWORD_PTR)objecttype; FormatMessageW(FORMAT_MESSAGE_FROM_STRING|FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_ARGUMENT_ARRAY, resstrW, 0, 0, (WCHAR*)&str, 0, (__ms_va_list*)args); RemoveMenu(hMenu, uPos, MF_BYPOSITION); InsertMenuW(hMenu, uPos, MF_BYPOSITION|MF_STRING, idmin, str); CoTaskMemFree(firstverb.lpszVerbName); HeapFree(GetProcessHeap(), 0, str); IEnumOLEVERB_Release(enumverbs); CoTaskMemFree(usertype); return TRUE; } submenu = CreatePopupMenu(); insert_verb_to_menu(submenu, idmin, &firstverb); CoTaskMemFree(firstverb.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; /* now submenu is ready, add root entry to original menu, attach submenu */ LoadStringW(OLEDLG_hInstance, IDS_VERBMENU_OBJECT_WITH_NAME, resstrW, sizeof(resstrW)/sizeof(WCHAR)); args[0] = (DWORD_PTR)objecttype; FormatMessageW(FORMAT_MESSAGE_FROM_STRING|FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_ARGUMENT_ARRAY, resstrW, 0, 0, (WCHAR*)&str, 0, (__ms_va_list*)args); InsertMenuW(hMenu, uPos, MF_BYPOSITION|MF_POPUP|MF_STRING, (UINT_PTR)submenu, str); HeapFree(GetProcessHeap(), 0, str); IEnumOLEVERB_Release(enumverbs); CoTaskMemFree(usertype); return TRUE; }
/*********************************************************************** * OleUIAddVerbMenuW (OLEDLG.14) */ BOOL WINAPI OleUIAddVerbMenuW(IOleObject *object, LPCWSTR shorttype, HMENU hMenu, UINT uPos, UINT idmin, UINT idmax, BOOL addConvert, UINT idConvert, HMENU *ret_submenu) { static const WCHAR spaceW[] = {' ',0}; IEnumOLEVERB *enumverbs = NULL; WCHAR *rootname, *objecttype; LPOLESTR usertype = NULL; OLEVERB firstverb, verb; 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 (ret_submenu) *ret_submenu = NULL; if (!hMenu || !ret_submenu) return FALSE; /* check if we can get verbs at all */ if (object) IOleObject_EnumVerbs(object, &enumverbs); 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, resstrW); return FALSE; } /* root entry string */ if (!shorttype && (IOleObject_GetUserType(object, USERCLASSTYPE_SHORT, &usertype) == S_OK)) objecttype = usertype; else objecttype = (WCHAR*)shorttype; rootname = CoTaskMemAlloc((strlenW(objecttype) + strlenW(resstrW) + 2)*sizeof(WCHAR)); strcpyW(rootname, objecttype); strcatW(rootname, spaceW); 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 (singleverb && !addConvert) { WCHAR *str = CoTaskMemAlloc((strlenW(rootname) + strlenW(firstverb.lpszVerbName) + 2)*sizeof(WCHAR)); strcpyW(str, firstverb.lpszVerbName); strcatW(str, spaceW); strcatW(str, rootname); RemoveMenu(hMenu, uPos, MF_BYPOSITION); InsertMenuW(hMenu, uPos, MF_BYPOSITION|MF_STRING, idmin, str); CoTaskMemFree(firstverb.lpszVerbName); CoTaskMemFree(rootname); CoTaskMemFree(str); IEnumOLEVERB_Release(enumverbs); return TRUE; } submenu = CreatePopupMenu(); insert_verb_to_menu(submenu, idmin, &firstverb); CoTaskMemFree(firstverb.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; /* now submenu is ready, add root entry to original menu, attach submenu */ InsertMenuW(hMenu, uPos, MF_BYPOSITION|MF_POPUP|MF_STRING, (UINT_PTR)submenu, rootname); IEnumOLEVERB_Release(enumverbs); CoTaskMemFree(rootname); return TRUE; }