From 1a3551b630eae2418692f21790fcc7fc973f5366 Mon Sep 17 00:00:00 2001 From: Dylan Smith Date: Mon, 2 Feb 2009 01:32:20 -0500 Subject: [PATCH] richedit: Use width from EM_SETTARGETDEVICE for wrapping. The width for EM_SETTARGETDEVICE is used by some applications to set the wrapping width to a certain distance in twips. This can be used even though the target device is ignored. --- dlls/riched20/context.c | 6 +++++- dlls/riched20/editor.c | 15 ++++++++++++--- dlls/riched20/editstr.h | 6 ++++-- dlls/riched20/tests/editor.c | 4 ++-- dlls/riched20/wrap.c | 2 +- dlls/riched32/tests/editor.c | 4 ++-- 6 files changed, 26 insertions(+), 11 deletions(-) diff --git a/dlls/riched20/context.c b/dlls/riched20/context.c index 6d4a2a93580..93d5caaed69 100644 --- a/dlls/riched20/context.c +++ b/dlls/riched20/context.c @@ -22,7 +22,7 @@ void ME_InitContext(ME_Context *c, ME_TextEditor *editor, HDC hDC) { - c->nSequence = editor->nSequence++; + c->nSequence = editor->nSequence++; c->hDC = hDC; c->editor = editor; c->pt.x = 0; @@ -35,6 +35,10 @@ void ME_InitContext(ME_Context *c, ME_TextEditor *editor, HDC hDC) } else { c->dpi.cx = c->dpi.cy = 96; } + if (editor->nAvailWidth) + c->nAvailWidth = ME_twips2pointsX(c, editor->nAvailWidth); + else + c->nAvailWidth = c->rcView.right - c->rcView.left; } void ME_DestroyContext(ME_Context *c) diff --git a/dlls/riched20/editor.c b/dlls/riched20/editor.c index 574118aede4..f875385409d 100644 --- a/dlls/riched20/editor.c +++ b/dlls/riched20/editor.c @@ -4332,14 +4332,23 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam, if (wParam == 0) { BOOL new = (lParam == 0); - if (editor->bWordWrap != new) + if (editor->nAvailWidth || editor->bWordWrap != new) { editor->bWordWrap = new; + editor->nAvailWidth = 0; /* wrap to client area */ ME_RewrapRepaint(editor); } + } else { + int width = max(0, lParam); + if (!editor->bWordWrap || editor->nAvailWidth != width) + { + editor->nAvailWidth = width; + editor->bWordWrap = TRUE; + ME_RewrapRepaint(editor); + } + FIXME("EM_SETTARGETDEVICE doesn't use non-NULL target devices\n"); } - else FIXME("Unsupported yet non NULL device in EM_SETTARGETDEVICE\n"); - break; + return TRUE; default: do_default: *phresult = S_FALSE; diff --git a/dlls/riched20/editstr.h b/dlls/riched20/editstr.h index a6450753712..63ef7f97277 100644 --- a/dlls/riched20/editstr.h +++ b/dlls/riched20/editstr.h @@ -342,6 +342,7 @@ typedef struct tagME_TextEditor SIZE sizeWindow; int nTotalLength, nLastTotalLength; int nTotalWidth, nLastTotalWidth; + int nAvailWidth; /* 0 = wrap to client area, else wrap width in twips */ int nUDArrowX; int nSequence; COLORREF rgbBackColor; @@ -396,6 +397,7 @@ typedef struct tagME_Context RECT rcView; HBRUSH hbrMargin; SIZE dpi; + int nAvailWidth; /* those are valid inside ME_WrapTextParagraph and related */ POINT ptFirstRun; @@ -413,9 +415,9 @@ typedef struct tagME_WrapContext POINT pt; BOOL bOverflown, bWordWrap; ME_DisplayItem *pRowStart; - + ME_DisplayItem *pLastSplittableRun; POINT ptLastSplittableRun; -} ME_WrapContext; +} ME_WrapContext; #endif diff --git a/dlls/riched20/tests/editor.c b/dlls/riched20/tests/editor.c index 29d3124ec3a..f8da3faf109 100644 --- a/dlls/riched20/tests/editor.c +++ b/dlls/riched20/tests/editor.c @@ -5939,12 +5939,12 @@ static void test_word_wrap(void) /* Test the effect of EM_SETTARGETDEVICE on word wrap. */ res = SendMessage(hwnd, EM_SETTARGETDEVICE, 0, 1); - todo_wine ok(res, "EM_SETTARGETDEVICE failed (returned %d).\n", res); + ok(res, "EM_SETTARGETDEVICE failed (returned %d).\n", res); pos = SendMessage(hwnd, EM_CHARFROMPOS, 0, (LPARAM) &point); ok(!pos, "pos=%d indicating word wrap when none is expected.\n", pos); res = SendMessage(hwnd, EM_SETTARGETDEVICE, 0, 0); - todo_wine ok(res, "EM_SETTARGETDEVICE failed (returned %d).\n", res); + ok(res, "EM_SETTARGETDEVICE failed (returned %d).\n", res); pos = SendMessage(hwnd, EM_CHARFROMPOS, 0, (LPARAM) &point); ok(pos, "pos=%d indicating no word wrap when it is expected.\n", pos); DestroyWindow(hwnd); diff --git a/dlls/riched20/wrap.c b/dlls/riched20/wrap.c index 4edbbb2d849..a2da5ebdd3c 100644 --- a/dlls/riched20/wrap.c +++ b/dlls/riched20/wrap.c @@ -77,7 +77,7 @@ static void ME_BeginRow(ME_WrapContext *wc, ME_DisplayItem *para) - (wc->nRow ? wc->nLeftMargin : wc->nFirstMargin) - wc->nRightMargin; wc->bWordWrap = TRUE; } else { - wc->nAvailWidth = wc->context->rcView.right - wc->context->rcView.left + wc->nAvailWidth = wc->context->nAvailWidth - (wc->nRow ? wc->nLeftMargin : wc->nFirstMargin) - wc->nRightMargin; } wc->pt.x = wc->context->pt.x; diff --git a/dlls/riched32/tests/editor.c b/dlls/riched32/tests/editor.c index ac98d16518e..e81f033c917 100644 --- a/dlls/riched32/tests/editor.c +++ b/dlls/riched32/tests/editor.c @@ -897,12 +897,12 @@ static void test_word_wrap(void) /* Test the effect of EM_SETTARGETDEVICE on word wrap. */ res = SendMessage(hwnd, EM_SETTARGETDEVICE, 0, 1); - todo_wine ok(res, "EM_SETTARGETDEVICE failed (returned %d).\n", res); + ok(res, "EM_SETTARGETDEVICE failed (returned %d).\n", res); pos = SendMessage(hwnd, EM_CHARFROMPOS, 0, (LPARAM) &point); ok(!pos, "pos=%d indicating word wrap when none is expected.\n", pos); res = SendMessage(hwnd, EM_SETTARGETDEVICE, 0, 0); - todo_wine ok(res, "EM_SETTARGETDEVICE failed (returned %d).\n", res); + ok(res, "EM_SETTARGETDEVICE failed (returned %d).\n", res); pos = SendMessage(hwnd, EM_CHARFROMPOS, 0, (LPARAM) &point); ok(pos, "pos=%d indicating no word wrap when it is expected.\n", pos); DestroyWindow(hwnd);