richedit: Use width from EM_SETTARGETDEVICE for wrapping.

Dylan Smith dylan.ah.smith at gmail.com
Mon Feb 2 00:32:20 CST 2009


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.

This patch also fixes the return value which was incorrectly reported
even for the case that was already implemented.
---
 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(-)
-------------- next part --------------
diff --git a/dlls/riched20/context.c b/dlls/riched20/context.c
index 6d4a2a9..93d5caa 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 574118a..f875385 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 a645075..63ef7f9 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 29d3124..f8da3fa 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 4edbbb2..a2da5eb 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 ac98d16..e81f033 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);


More information about the wine-patches mailing list