From: Nikolay Sivov Subject: [PATCH 1/3] riched20: Implement GetName() for ITextFont Message-Id: <555DA2F2.2040308@codeweavers.com> Date: Thu, 21 May 2015 12:18:42 +0300 --- From be084056a4abc33e45727b5f52fd9bda012dfae7 Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Thu, 21 May 2015 11:25:24 +0300 Subject: [PATCH 1/3] riched20: Implement GetName() for ITextFont --- dlls/riched20/richole.c | 41 +++++++++++++++++-- dlls/riched20/tests/richole.c | 93 +++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 127 insertions(+), 7 deletions(-) diff --git a/dlls/riched20/richole.c b/dlls/riched20/richole.c index c9c75b8..215d326 100644 --- a/dlls/riched20/richole.c +++ b/dlls/riched20/richole.c @@ -213,7 +213,8 @@ static const DWORD textfont_prop_masks[] = { typedef union { FLOAT f; - LONG l; + LONG l; + BSTR str; } textfont_prop_val; static inline BOOL is_equal_textfont_prop_value(enum textfont_prop_id propid, textfont_prop_val *left, @@ -230,6 +231,8 @@ static inline BOOL is_equal_textfont_prop_value(enum textfont_prop_id propid, te case FONT_SUPERSCRIPT: case FONT_UNDERLINE: return left->l == right->l; + case FONT_NAME: + return !strcmpW(left->str, right->str); case FONT_SIZE: return left->f == right->f; default: @@ -252,6 +255,9 @@ static inline void init_textfont_prop_value(enum textfont_prop_id propid, textfo case FONT_UNDERLINE: v->l = tomUndefined; return; + case FONT_NAME: + v->str = NULL; + return; case FONT_SIZE: v->f = tomUndefined; return; @@ -291,6 +297,12 @@ static HRESULT get_textfont_prop_for_pos(const IRichEditOleImpl *reole, int pos, case FONT_LANGID: value->l = fmt.lcid; break; + case FONT_NAME: + /* this case is used exclusively by GetName() */ + value->str = SysAllocString(fmt.szFaceName); + if (!value->str) + return E_OUTOFMEMORY; + break; case FONT_SIZE: value->f = fmt.yHeight; break; @@ -1991,8 +2003,31 @@ static HRESULT WINAPI TextFont_SetLanguageID(ITextFont *iface, LONG value) static HRESULT WINAPI TextFont_GetName(ITextFont *iface, BSTR *value) { ITextFontImpl *This = impl_from_ITextFont(iface); - FIXME("(%p)->(%p): stub\n", This, value); - return E_NOTIMPL; + const IRichEditOleImpl *reole; + textfont_prop_val v; + LONG start; + HRESULT hr; + + TRACE("(%p)->(%p)\n", This, value); + + if (!value) + return E_INVALIDARG; + + *value = NULL; + + ITextRange_QueryInterface(This->range, &IID_Igetrichole, (void**)&reole); + if (!reole) + return CO_E_RELEASED; + + init_textfont_prop_value(FONT_NAME, &v); + + ITextRange_GetStart(This->range, &start); + hr = get_textfont_prop_for_pos(reole, start, FONT_NAME, &v); + if (FAILED(hr)) + return hr; + + *value = v.str; + return S_OK; } static HRESULT WINAPI TextFont_SetName(ITextFont *iface, BSTR value) diff --git a/dlls/riched20/tests/richole.c b/dlls/riched20/tests/richole.c index a47d31f..042bef4 100644 --- a/dlls/riched20/tests/richole.c +++ b/dlls/riched20/tests/richole.c @@ -130,14 +130,12 @@ static void test_Interfaces(void) res = SendMessageA(w, EM_GETOLEINTERFACE, 0, (LPARAM)&reOle); ok(res, "SendMessage\n"); ok(reOle != NULL, "EM_GETOLEINTERFACE\n"); - refcount = get_refcount((IUnknown *)reOle); - ok(refcount == 2, "got wrong ref count: %d\n", refcount); + EXPECT_REF(reOle, 2); res = SendMessageA(w, EM_GETOLEINTERFACE, 0, (LPARAM)&reOle1); ok(res == 1, "SendMessage\n"); ok(reOle1 == reOle, "Should not return a new IRichEditOle interface\n"); - refcount = get_refcount((IUnknown *)reOle); - ok(refcount == 3, "got wrong ref count: %d\n", refcount); + EXPECT_REF(reOle, 3); hres = IRichEditOle_QueryInterface(reOle, &IID_ITextDocument, (void **) &txtDoc); @@ -147,12 +145,21 @@ static void test_Interfaces(void) hres = ITextDocument_GetSelection(txtDoc, NULL); ok(hres == E_INVALIDARG, "ITextDocument_GetSelection: 0x%x\n", hres); + EXPECT_REF(txtDoc, 4); + hres = ITextDocument_GetSelection(txtDoc, &txtSel); ok(hres == S_OK, "got 0x%08x\n", hres); + EXPECT_REF(txtDoc, 4); + EXPECT_REF(txtSel, 2); + hres = ITextDocument_GetSelection(txtDoc, &txtSel2); ok(hres == S_OK, "got 0x%08x\n", hres); ok(txtSel2 == txtSel, "got %p, %p\n", txtSel, txtSel2); + + EXPECT_REF(txtDoc, 4); + EXPECT_REF(txtSel, 3); + ITextSelection_Release(txtSel2); punk = NULL; @@ -1415,6 +1422,83 @@ todo_wine { release_interfaces(&hwnd, &reOle, &doc, NULL); } +static void test_ITextFont(void) +{ + static const WCHAR sysW[] = {'S','y','s','t','e','m',0}; + static const WCHAR arialW[] = {'A','r','i','a','l',0}; + static const CHAR test_text1[] = "TestSomeText"; + IRichEditOle *reOle = NULL; + ITextDocument *doc = NULL; + ITextRange *range = NULL; + ITextFont *font; + CHARFORMAT2A cf; + HRESULT hr; + HWND hwnd; + BOOL ret; + BSTR str; + + create_interfaces(&hwnd, &reOle, &doc, NULL); + SendMessageA(hwnd, WM_SETTEXT, 0, (LPARAM)test_text1); + + hr = ITextDocument_Range(doc, 0, 10, &range); + ok(hr == S_OK, "got 0x%08x\n", hr); + + hr = ITextRange_GetFont(range, &font); + ok(hr == S_OK, "got 0x%08x\n", hr); + + hr = ITextFont_GetName(font, NULL); + ok(hr == E_INVALIDARG, "got 0x%08x\n", hr); + + /* default font name */ + str = NULL; + hr = ITextFont_GetName(font, &str); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(!lstrcmpW(str, sysW), "got %s\n", wine_dbgstr_w(str)); + SysFreeString(str); + + /* change font name for an inner subrange */ + memset(&cf, 0, sizeof(cf)); + cf.cbSize = sizeof(cf); + cf.dwMask = CFM_FACE; + strcpy(cf.szFaceName, "Arial"); + + SendMessageA(hwnd, EM_SETSEL, 3, 4); + ret = SendMessageA(hwnd, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf); + ok(ret, "got %d\n", ret); + + /* still original name */ + str = NULL; + hr = ITextFont_GetName(font, &str); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(!lstrcmpW(str, sysW), "got %s\n", wine_dbgstr_w(str)); + SysFreeString(str); + + SendMessageA(hwnd, EM_SETSEL, 1, 2); + ret = SendMessageA(hwnd, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf); + ok(ret, "got %d\n", ret); + + str = NULL; + hr = ITextFont_GetName(font, &str); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(!lstrcmpW(str, sysW), "got %s\n", wine_dbgstr_w(str)); + SysFreeString(str); + + /* name is returned for first position within a range */ + SendMessageA(hwnd, EM_SETSEL, 0, 1); + ret = SendMessageA(hwnd, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf); + ok(ret, "got %d\n", ret); + + str = NULL; + hr = ITextFont_GetName(font, &str); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(!lstrcmpW(str, arialW), "got %s\n", wine_dbgstr_w(str)); + SysFreeString(str); + + ITextFont_Release(font); + ITextRange_Release(range); + release_interfaces(&hwnd, &reOle, &doc, NULL); +} + START_TEST(richole) { /* Must explicitly LoadLibrary(). The test has no references to functions in @@ -1439,4 +1523,5 @@ START_TEST(richole) test_GetFont(); test_GetPara(); test_dispatch(); + test_ITextFont(); } -- 2.1.4