From: Jactry Zeng Subject: [PATCH] riched20: Implement ITextSelection::GetChar. Message-Id: <53CE38BB.9080109@jactry.com> Date: Tue, 22 Jul 2014 18:11:07 +0800 --- dlls/riched20/richole.c | 13 +++++++++-- dlls/riched20/tests/richole.c | 51 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+), 2 deletions(-) diff --git a/dlls/riched20/richole.c b/dlls/riched20/richole.c index 487fcda..7d7413e 100644 --- a/dlls/riched20/richole.c +++ b/dlls/riched20/richole.c @@ -826,11 +826,20 @@ static HRESULT WINAPI ITextSelection_fnSetText(ITextSelection *me, BSTR bstr) static HRESULT WINAPI ITextSelection_fnGetChar(ITextSelection *me, LONG *pch) { ITextSelectionImpl *This = impl_from_ITextSelection(me); + WCHAR wch[2]; + ME_Cursor *start = NULL, *end = NULL; + if (!This->reOle) return CO_E_RELEASED; + TRACE("%p\n", pch); + if (!pch) + return E_INVALIDARG; - FIXME("not implemented\n"); - return E_NOTIMPL; + ME_GetSelection(This->reOle->editor, &start, &end); + ME_GetTextW(This->reOle->editor, wch, 1, start, 1, FALSE, start->pRun->next->type == diTextEnd); + *pch = wch[0]; + + return S_OK; } static HRESULT WINAPI ITextSelection_fnSetChar(ITextSelection *me, LONG ch) diff --git a/dlls/riched20/tests/richole.c b/dlls/riched20/tests/richole.c index 98ac50d..f61adfc 100644 --- a/dlls/riched20/tests/richole.c +++ b/dlls/riched20/tests/richole.c @@ -491,6 +491,56 @@ static void test_ITextSelection_GetText(void) release_interfaces(&w, &reOle, &txtDoc, &txtSel); } +static void test_ITextSelection_GetChar(void) +{ + HWND w; + IRichEditOle *reOle = NULL; + ITextDocument *txtDoc = NULL; + ITextSelection *txtSel = NULL; + HRESULT hres; + LONG pch = 0xdeadbeef; + int first, lim; + static const CHAR test_text1[] = "TestSomeText"; + + create_interfaces(&w, &reOle, &txtDoc, &txtSel); + SendMessageA(w, WM_SETTEXT, 0, (LPARAM)test_text1); + + first = 0, lim = 4; + SendMessageA(w, EM_SETSEL, first, lim); + pch = 0xdeadbeef; + hres = ITextSelection_GetChar(txtSel, &pch); + ok(hres == S_OK, "ITextSelection_GetChar\n"); + ok(pch == 'T', "got wrong char: %c\n", pch); + + /* the position of the first character is zero */ + first = 0, lim = 0; + SendMessageA(w, EM_SETSEL, first, lim); + pch = 0xdeadbeef; + hres = ITextSelection_GetChar(txtSel, &pch); + ok(hres == S_OK, "ITextSelection_GetChar\n"); + ok(pch == 'T', "got wrong char: %c\n", pch); + + /* get a '\r' at the end of the story */ + first = 12, lim = 12; + SendMessageA(w, EM_SETSEL, first, lim); + pch = 0xdeadbeef; + hres = ITextSelection_GetChar(txtSel, &pch); + ok(hres == S_OK, "ITextSelection_GetChar\n"); + ok(pch == '\r', "got wrong char: %c\n", pch); + + first = 13, lim = 13; + SendMessageA(w, EM_SETSEL, first, lim); + pch = 0xdeadbeef; + hres = ITextSelection_GetChar(txtSel, &pch); + ok(hres == S_OK, "ITextSelection_GetChar\n"); + ok(pch == '\r', "got wrong char: %c\n", pch); + + hres = ITextSelection_GetChar(txtSel, NULL); + ok(hres == E_INVALIDARG, "ITextSelection_GetChar\n"); + + release_interfaces(&w, &reOle, &txtDoc, &txtSel); +} + START_TEST(richole) { /* Must explicitly LoadLibrary(). The test has no references to functions in @@ -501,4 +551,5 @@ START_TEST(richole) test_Interfaces(); test_ITextDocument_Open(); test_ITextSelection_GetText(); + test_ITextSelection_GetChar(); }