From: Jactry Zeng Subject: [PATCH 3/8] riched20: Implement IText{Selection, Range}::Get{Start, End}. Message-Id: <53E86219.9030002@jactry.com> Date: Mon, 11 Aug 2014 14:26:33 +0800 --- dlls/riched20/richole.c | 30 ++++++++++++++++++------- dlls/riched20/tests/richole.c | 52 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+), 8 deletions(-) diff --git a/dlls/riched20/richole.c b/dlls/riched20/richole.c index f39e0ae..071496d 100644 --- a/dlls/riched20/richole.c +++ b/dlls/riched20/richole.c @@ -635,8 +635,11 @@ static HRESULT WINAPI ITextRange_fnGetStart(ITextRange *me, LONG *pcpFirst) if (!This->reOle) return CO_E_RELEASED; - FIXME("not implemented %p\n", This); - return E_NOTIMPL; + if (!pcpFirst) + return E_INVALIDARG; + *pcpFirst = This->start; + TRACE("%d\n", *pcpFirst); + return S_OK; } static HRESULT WINAPI ITextRange_fnSetStart(ITextRange *me, LONG cpFirst) @@ -655,8 +658,11 @@ static HRESULT WINAPI ITextRange_fnGetEnd(ITextRange *me, LONG *pcpLim) if (!This->reOle) return CO_E_RELEASED; - FIXME("not implemented %p\n", This); - return E_NOTIMPL; + if (!pcpLim) + return E_INVALIDARG; + *pcpLim = This->end; + TRACE("%d\n", *pcpLim); + return S_OK; } static HRESULT WINAPI ITextRange_fnSetEnd(ITextRange *me, LONG cpLim) @@ -1621,11 +1627,15 @@ static HRESULT WINAPI ITextSelection_fnSetFormattedText(ITextSelection *me, ITex static HRESULT WINAPI ITextSelection_fnGetStart(ITextSelection *me, LONG *pcpFirst) { ITextSelectionImpl *This = impl_from_ITextSelection(me); + int lim; if (!This->reOle) return CO_E_RELEASED; - FIXME("not implemented\n"); - return E_NOTIMPL; + if (!pcpFirst) + return E_INVALIDARG; + ME_GetSelectionOfs(This->reOle->editor, pcpFirst, &lim); + TRACE("%d\n", *pcpFirst); + return S_OK; } static HRESULT WINAPI ITextSelection_fnSetStart(ITextSelection *me, LONG cpFirst) @@ -1641,11 +1651,15 @@ static HRESULT WINAPI ITextSelection_fnSetStart(ITextSelection *me, LONG cpFirst static HRESULT WINAPI ITextSelection_fnGetEnd(ITextSelection *me, LONG *pcpLim) { ITextSelectionImpl *This = impl_from_ITextSelection(me); + int first; if (!This->reOle) return CO_E_RELEASED; - FIXME("not implemented\n"); - return E_NOTIMPL; + if (!pcpLim) + return E_INVALIDARG; + ME_GetSelectionOfs(This->reOle->editor, &first, pcpLim); + TRACE("%d\n", *pcpLim); + return S_OK; } static HRESULT WINAPI ITextSelection_fnSetEnd(ITextSelection *me, LONG cpLim) diff --git a/dlls/riched20/tests/richole.c b/dlls/riched20/tests/richole.c index 152d144..e46e2af 100644 --- a/dlls/riched20/tests/richole.c +++ b/dlls/riched20/tests/richole.c @@ -586,6 +586,57 @@ static void test_ITextRange_GetChar(void) release_interfaces(&w, &reOle, &txtDoc, NULL); } +static void test_GetStart_GetEnd(void) +{ + HWND w; + IRichEditOle *reOle = NULL; + ITextDocument *txtDoc = NULL; + ITextRange *txtRge = NULL; + ITextSelection *txtSel = NULL; + HRESULT hres; + int start, end; + static const CHAR test_text1[] = "TestSomeText"; + + create_interfaces(&w, &reOle, &txtDoc, &txtSel); + SendMessageA(w, WM_SETTEXT, 0, (LPARAM)test_text1); + + /* tests for ITextRange::Get{Start, End} */ +#define TEST_TXTRGE_GETSTARTEND(first, lim, expected_start, expected_end) \ + ITextDocument_Range(txtDoc, first, lim, &txtRge); \ + start = 0xdeadbeef; \ + hres = ITextRange_GetStart(txtRge, &start); \ + ok(hres == S_OK, "ITextRange_GetStart\n"); \ + ok(start == expected_start, "got wrong start value: %d\n", start); \ + end = 0xdeadbeef; \ + hres = ITextRange_GetEnd(txtRge, &end); \ + ok(hres == S_OK, "ITextRange_GetEnd\n"); \ + ok(end == expected_end, "got wrong end value: %d\n", end); \ + ITextRange_Release(txtRge); + + TEST_TXTRGE_GETSTARTEND(1, 6, 1, 6) + TEST_TXTRGE_GETSTARTEND(6, 1, 1, 6) + TEST_TXTRGE_GETSTARTEND(-1, 13, 0, 13) + TEST_TXTRGE_GETSTARTEND(13, 13, 12, 12) + + /* tests for ITextSelection::Get{Start, End} */ +#define TEST_TXTSEL_GETSTARTEND(first, lim, expected_start, expected_end) \ + SendMessageA(w, EM_SETSEL, first, lim); \ + start = 0xdeadbeef; \ + hres = ITextSelection_GetStart(txtSel, &start); \ + ok(hres == S_OK, "ITextSelection_GetStart\n"); \ + ok(start == expected_start, "got wrong start value: %d\n", start); \ + end = 0xdeadbeef; \ + hres = ITextSelection_GetEnd(txtSel, &end); \ + ok(end == expected_end, "got wrong end value: %d\n", end); + + TEST_TXTSEL_GETSTARTEND(2, 5, 2, 5) + TEST_TXTSEL_GETSTARTEND(5, 2, 2, 5) + TEST_TXTSEL_GETSTARTEND(0, -1, 0, strlen(test_text1)+1) + TEST_TXTSEL_GETSTARTEND(13, 13, 12, 12) + + release_interfaces(&w, &reOle, &txtDoc, &txtSel); +} + START_TEST(richole) { /* Must explicitly LoadLibrary(). The test has no references to functions in @@ -599,4 +650,5 @@ START_TEST(richole) test_ITextSelection_GetChar(); test_ITextDocument_Range(); test_ITextRange_GetChar(); + test_GetStart_GetEnd(); }