Module: wine Branch: master Commit: f0959dc1759a8434ccab66eecd0b671693a1a96a URL: http://source.winehq.org/git/wine.git/?a=commit;h=f0959dc1759a8434ccab66eecd...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Sun May 17 17:30:06 2015 +0300
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 1cb47c2..4f85325 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 2d46729..0af617b 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);