Signed-off-by: Jactry Zeng jzeng@codeweavers.com --- dlls/riched20/tests/txtsrv.c | 65 ++++++++++++++++++++++++++++++++++++++++++-- dlls/riched20/txtsrv.c | 32 ++++++++++++++++++++-- 2 files changed, 93 insertions(+), 4 deletions(-)
diff --git a/dlls/riched20/tests/txtsrv.c b/dlls/riched20/tests/txtsrv.c index 000b214cb5..4b6758192e 100644 --- a/dlls/riched20/tests/txtsrv.c +++ b/dlls/riched20/tests/txtsrv.c @@ -424,9 +424,10 @@ static HRESULT WINAPI ITextHostImpl_TxGetPropertyBits(ITextHost *iface, DWORD *pdwBits) { ITextHostTestImpl *This = impl_from_ITextHost(iface); + DWORD bits = TXTBIT_MULTILINE | TXTBIT_WORDWRAP; TRACECALL("Call to TxGetPropertyBits(%p, dwMask=0x%08x, pdwBits=%p)\n", This, dwMask, pdwBits); - *pdwBits = 0; + *pdwBits = bits & dwMask; return S_OK; }
@@ -809,6 +810,13 @@ static void test_TxGetNaturalSize(void) HRESULT result; SIZEL psizelExtent = {-1,-1}; static const WCHAR test_text[] = {'T','e','s','t','S','o','m','e','T','e','x','t',0}; + static const WCHAR long_text[] = {'T','e','s','t','W','i','t','h','A','L','o','n','g', + 'L','i','n','e','S','t','r','i','n','g',0}; + static const WCHAR long_text1[] = {'T','e','s','t','W','i','t','h','Y','e','t','A','n', + 'o','t','h','o','r','L', 'o','n','g','L','i','n','e', + 'S','t','r','i','n','g','W','h','i','c','h','H','a', + 's','M','o','r','e','T','h','a','n','T','w','o','L', + 'i','n','e','s',0}; LONG width, height, expected_width, expected_height, lines; HDC hdcDraw; HWND hwnd; @@ -846,7 +854,60 @@ static void test_TxGetNaturalSize(void) height = 0; result = ITextServices_TxGetNaturalSize(txtserv, DVASPECT_CONTENT, hdcDraw, NULL, NULL, TXTNS_FITTOCONTENT, &psizelExtent, &width, &height); - todo_wine CHECK_TXGETNATURALSIZE(result, width, height, expected_width, expected_height); + CHECK_TXGETNATURALSIZE(result, width, height, expected_width, expected_height); + + psizelExtent.cx = 1; psizelExtent.cy = 1; + width = rect.right - rect.left; + height = 0; + result = ITextServices_TxGetNaturalSize(txtserv, DVASPECT_CONTENT, hdcDraw, NULL, NULL, + TXTNS_FITTOCONTENT, &psizelExtent, &width, &height); + CHECK_TXGETNATURALSIZE(result, width, height, expected_width, expected_height); + + psizelExtent.cx = 0; psizelExtent.cy = 0; + width = rect.right - rect.left; + height = 0; + result = ITextServices_TxGetNaturalSize(txtserv, DVASPECT_CONTENT, hdcDraw, NULL, NULL, + TXTNS_FITTOCONTENT, &psizelExtent, &width, &height); + CHECK_TXGETNATURALSIZE(result, width, height, 0, 0); + + psizelExtent.cx = -1; psizelExtent.cy = -1; + result = ITextServices_TxGetNaturalSize(txtserv, DVASPECT_CONTENT, hdcDraw, NULL, NULL, + TXTNS_FITTOCONTENT, &psizelExtent, NULL, NULL); + ok(result == E_INVALIDARG, "ITextServices_TxGetNaturalSize should fail: 0x%08x.\n", result); + + /* Test with a long line string */ + result = ITextServices_TxSetText(txtserv, long_text); + ok(result == S_OK, "ITextServices_TxSetText failed result: 0x%08x.\n", result); + + old_hf = SelectObject(hdcDraw, hf); + expected_width = get_max_width(hdcDraw, long_text, rect.right - rect.left, &lines); + GetTextMetricsA(hdcDraw, &tm); + expected_height = (tm.tmAscent + tm.tmDescent) * lines; + SelectObject(hdcDraw, old_hf); + + psizelExtent.cx = -1; psizelExtent.cy = -1; + width = rect.right - rect.left; + height = 0; + result = ITextServices_TxGetNaturalSize(txtserv, DVASPECT_CONTENT, hdcDraw, NULL, NULL, + TXTNS_FITTOCONTENT, &psizelExtent, &width, &height); + CHECK_TXGETNATURALSIZE(result, width, height, expected_width, expected_height); + + /* Test with string which has more than two lines */ + result = ITextServices_TxSetText(txtserv, long_text1); + ok(result == S_OK, "ITextServices_TxSetText failed result: 0x%08x.\n", result); + + old_hf = SelectObject(hdcDraw, hf); + expected_width = get_max_width(hdcDraw, long_text1, rect.right - rect.left, &lines); + GetTextMetricsA(hdcDraw, &tm); + expected_height = (tm.tmAscent + tm.tmDescent) * lines; + SelectObject(hdcDraw, old_hf); + + psizelExtent.cx = -1; psizelExtent.cy = -1; + width = rect.right - rect.left; + height = 0; + result = ITextServices_TxGetNaturalSize(txtserv, DVASPECT_CONTENT, hdcDraw, NULL, NULL, + TXTNS_FITTOCONTENT, &psizelExtent, &width, &height); + CHECK_TXGETNATURALSIZE(result, width, height, expected_width, expected_height);
ReleaseDC(NULL,hdcDraw); DestroyWindow(hwnd); diff --git a/dlls/riched20/txtsrv.c b/dlls/riched20/txtsrv.c index eb61e4eff6..a621e7e6e9 100644 --- a/dlls/riched20/txtsrv.c +++ b/dlls/riched20/txtsrv.c @@ -319,9 +319,37 @@ DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_TxGetNaturalSize(ITextServices *iface, const SIZEL *psizelExtent, LONG *pwidth, LONG *pheight) { ITextServicesImpl *This = impl_from_ITextServices(iface); + if (!pwidth || !pheight) + return E_INVALIDARG; + + TRACE("(%p)->(%p, %x, %p, %p, %p, %x, %p, %p, %p\n)", This, iface, dwAspect, hdcDraw, + hicTargetDev, ptd, dwMode, psizelExtent, pwidth, pheight); + + if (dwAspect != DVASPECT_CONTENT) + FIXME("Unsupported aspect: %x\n", dwAspect); + if (hicTargetDev) + FIXME("Unsupported hicTargetDev: %p\n", hicTargetDev); + if (ptd) + FIXME("Unsupported ptd: %p\n", ptd); + if (dwMode != TXTNS_FITTOCONTENT) + FIXME("Unsupported mode: %x\n", dwMode); + + if (!psizelExtent->cy) + { + *pwidth = 0; + *pheight = 0; + return S_OK; + }
- FIXME("%p: STUB\n", This); - return E_NOTIMPL; + SetRectEmpty(&This->editor->rcFormat); + This->editor->rcFormat.right = *pwidth; + This->editor->rcFormat.bottom = *pheight; + ME_MarkAllForWrapping(This->editor); + ME_WrapMarkedParagraphs(This->editor, hdcDraw); + *pwidth = This->editor->nTotalWidth; + *pheight = This->editor->nTotalLength; + + return S_OK; }
DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_TxGetDropTarget(ITextServices *iface, IDropTarget **ppDropTarget)