From f0959dc1759a8434ccab66eecd0b671693a1a96a Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Sun, 17 May 2015 17:30:06 +0300 Subject: [PATCH] riched20: Implement SetEnd(). --- dlls/riched20/richole.c | 23 ++++++++++-- dlls/riched20/tests/richole.c | 70 +++++++++++++++++++++++++++++++++++ 2 files changed, 90 insertions(+), 3 deletions(-) diff --git a/dlls/riched20/richole.c b/dlls/riched20/richole.c index 1cb47c2c90b..4f85325d56a 100644 --- a/dlls/riched20/richole.c +++ b/dlls/riched20/richole.c @@ -948,14 +948,31 @@ static HRESULT WINAPI ITextRange_fnGetEnd(ITextRange *me, LONG *pcpLim) return S_OK; } -static HRESULT WINAPI ITextRange_fnSetEnd(ITextRange *me, LONG cpLim) +static HRESULT WINAPI ITextRange_fnSetEnd(ITextRange *me, LONG end) { ITextRangeImpl *This = impl_from_ITextRange(me); + int len; + + TRACE("(%p)->(%d)\n", This, end); + if (!This->reOle) return CO_E_RELEASED; - FIXME("not implemented %p\n", This); - return E_NOTIMPL; + if (end == This->end) + return S_FALSE; + + if (end < This->start) { + This->start = This->end = max(0, end); + return S_OK; + } + + len = ME_GetTextLength(This->reOle->editor); + if (end > len) + This->end = len + 1; + else + This->end = end; + + return S_OK; } static HRESULT WINAPI ITextRange_fnGetFont(ITextRange *me, ITextFont **font) diff --git a/dlls/riched20/tests/richole.c b/dlls/riched20/tests/richole.c index 2d46729a27d..0af617b6ca8 100644 --- a/dlls/riched20/tests/richole.c +++ b/dlls/riched20/tests/richole.c @@ -759,6 +759,76 @@ static void test_ITextRange_GetStart_GetEnd(void) ok(hres == S_OK, "got 0x%08x\n", hres); ok(end == 12, "got %d\n", end); + /* SetEnd */ + hres = ITextRange_SetStart(txtRge, 0); + ok(hres == S_OK, "got 0x%08x\n", hres); + + /* same value */ + hres = ITextRange_SetEnd(txtRge, 5); + ok(hres == S_OK, "got 0x%08x\n", hres); + + hres = ITextRange_SetEnd(txtRge, 5); + ok(hres == S_FALSE, "got 0x%08x\n", hres); + + /* negative resets to 0 */ + hres = ITextRange_SetEnd(txtRge, -1); + ok(hres == S_OK, "got 0x%08x\n", hres); + + end = -1; + hres = ITextRange_GetEnd(txtRge, &end); + ok(hres == S_OK, "got 0x%08x\n", hres); + ok(end == 0, "got %d\n", end); + + start = -1; + hres = ITextRange_GetStart(txtRge, &start); + ok(hres == S_OK, "got 0x%08x\n", hres); + ok(start == 0, "got %d\n", start); + + /* greater than initial end, but less than total char count */ + hres = ITextRange_SetStart(txtRge, 3); + ok(hres == S_OK, "got 0x%08x\n", hres); + + hres = ITextRange_SetEnd(txtRge, 1); + ok(hres == S_OK, "got 0x%08x\n", hres); + + start = 0; + hres = ITextRange_GetStart(txtRge, &start); + ok(hres == S_OK, "got 0x%08x\n", hres); + ok(start == 1, "got %d\n", start); + + end = 0; + hres = ITextRange_GetEnd(txtRge, &end); + ok(hres == S_OK, "got 0x%08x\n", hres); + ok(end == 1, "got %d\n", end); + + /* more than total count */ + hres = ITextRange_SetEnd(txtRge, 50); + ok(hres == S_OK, "got 0x%08x\n", hres); + + start = 0; + hres = ITextRange_GetStart(txtRge, &start); + ok(hres == S_OK, "got 0x%08x\n", hres); + ok(start == 1, "got %d\n", start); + + end = 0; + hres = ITextRange_GetEnd(txtRge, &end); + ok(hres == S_OK, "got 0x%08x\n", hres); + ok(end == 13, "got %d\n", end); + + /* zero */ + hres = ITextRange_SetEnd(txtRge, 0); + ok(hres == S_OK, "got 0x%08x\n", hres); + + start = 0; + hres = ITextRange_GetStart(txtRge, &start); + ok(hres == S_OK, "got 0x%08x\n", hres); + ok(start == 0, "got %d\n", start); + + end = 0; + hres = ITextRange_GetEnd(txtRge, &end); + ok(hres == S_OK, "got 0x%08x\n", hres); + ok(end == 0, "got %d\n", end); + ITextRange_Release(txtRge); release_interfaces(&w, &reOle, &txtDoc, NULL);