diff --git a/dlls/riched20/richole.c b/dlls/riched20/richole.c index 39c4bb4f032..1cb47c2c90b 100644 --- a/dlls/riched20/richole.c +++ b/dlls/riched20/richole.c @@ -905,14 +905,34 @@ static HRESULT WINAPI ITextRange_fnGetStart(ITextRange *me, LONG *pcpFirst) return S_OK; } -static HRESULT WINAPI ITextRange_fnSetStart(ITextRange *me, LONG cpFirst) +static HRESULT WINAPI ITextRange_fnSetStart(ITextRange *me, LONG start) { ITextRangeImpl *This = impl_from_ITextRange(me); + int len; + + TRACE("(%p)->(%d)\n", This, start); + if (!This->reOle) return CO_E_RELEASED; - FIXME("not implemented %p\n", This); - return E_NOTIMPL; + if (start == This->start) + return S_FALSE; + + if (start < 0) { + This->start = 0; + return S_OK; + } + + len = ME_GetTextLength(This->reOle->editor); + if (start > This->end) + This->end = len; + + if (start > len) + This->start = len; + else + This->start = start; + + return S_OK; } static HRESULT WINAPI ITextRange_fnGetEnd(ITextRange *me, LONG *pcpLim) diff --git a/dlls/riched20/tests/richole.c b/dlls/riched20/tests/richole.c index 6960c7a8db4..2d46729a27d 100644 --- a/dlls/riched20/tests/richole.c +++ b/dlls/riched20/tests/richole.c @@ -711,6 +711,54 @@ static void test_ITextRange_GetStart_GetEnd(void) hres = ITextRange_GetEnd(txtRge, &end); ok(hres == S_OK, "ITextRange_GetEnd\n"); ok(end == 12, "got wrong end value: %d\n", end); + + /* SetStart */ + hres = ITextRange_SetStart(txtRge, 0); + ok(hres == S_OK, "got 0x%08x\n", hres); + + /* same value */ + hres = ITextRange_SetStart(txtRge, 0); + ok(hres == S_FALSE, "got 0x%08x\n", hres); + + hres = ITextRange_SetStart(txtRge, 1); + ok(hres == S_OK, "got 0x%08x\n", hres); + + /* negative resets to 0 */ + hres = ITextRange_SetStart(txtRge, -1); + ok(hres == S_OK, "got 0x%08x\n", hres); + + 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, 10); + 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 == 10, "got %d\n", start); + + end = 0; + hres = ITextRange_GetEnd(txtRge, &end); + ok(hres == S_OK, "got 0x%08x\n", hres); + ok(end == 12, "got %d\n", end); + + hres = ITextRange_SetStart(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 == 12, "got %d\n", start); + + end = 0; + hres = ITextRange_GetEnd(txtRge, &end); + ok(hres == S_OK, "got 0x%08x\n", hres); + ok(end == 12, "got %d\n", end); + ITextRange_Release(txtRge); release_interfaces(&w, &reOle, &txtDoc, NULL);