riched20: fix text replacement with text limit

Clinton Stimpson cjstimpson at utwire.net
Wed Mar 28 08:03:41 CDT 2007


Here's a resend of the last patch to fix this bug, except with fewer 
code changes (and the actual patch attached).

This patch fixes bug 6985.

Moved the clearing of previous selections so it is done before 
calculating the amount of space available to insert new text, or the new 
text might not be inserted in place of the selection.

A test is included.

Thanks,
Clinton Stimpson

ChangeLog:
    Fix insertion of text when near/at the text limit.
-------------- next part --------------
Index: dlls/riched20/caret.c
===================================================================
RCS file: /home/wine/wine/dlls/riched20/caret.c,v
retrieving revision 1.36
diff -u -r1.36 caret.c
--- dlls/riched20/caret.c	11 Jan 2007 11:35:15 -0000	1.36
+++ dlls/riched20/caret.c	27 Mar 2007 03:51:10 -0000
@@ -431,19 +431,21 @@
 {
   const WCHAR *pos;
   ME_Cursor *p = NULL;
+  int freeSpace;
+ 
+  /* FIXME really HERE ? */
+  if (ME_IsSelection(editor))
+    ME_DeleteSelection(editor);
+
   /* FIXME: is this too slow? */
   /* Didn't affect performance for WM_SETTEXT (around 50sec/30K) */
-  int freeSpace = editor->nTextLimit - ME_GetTextLength(editor);
+  freeSpace = editor->nTextLimit - ME_GetTextLength(editor);
 
   /* text operations set modified state */
   editor->nModifyStep = 1;
 
   assert(style);
 
-  /* FIXME really HERE ? */
-  if (ME_IsSelection(editor))
-    ME_DeleteSelection(editor);
-
   assert(nCursor>=0 && nCursor<editor->nCursors);
   if (len == -1)
     len = lstrlenW(str);
Index: dlls/riched20/tests/editor.c
===================================================================
RCS file: /home/wine/wine/dlls/riched20/tests/editor.c,v
retrieving revision 1.41
diff -u -r1.41 editor.c
--- dlls/riched20/tests/editor.c	22 Mar 2007 15:12:15 -0000	1.41
+++ dlls/riched20/tests/editor.c	27 Mar 2007 03:51:10 -0000
@@ -1019,7 +1019,9 @@
 static void test_EM_EXLIMITTEXT(void)
 {
   int i, selBegin, selEnd, len1, len2;
+  int result;
   char text[1024 + 1];
+  char buffer[1024 + 1];
   int textlimit = 0; /* multiple of 100 */
   HWND hwndRichEdit = new_richedit(NULL);
   
@@ -1087,6 +1089,18 @@
     "EM_EXLIMITTEXT: No Change Expected\nOld Length: %d, New Length: %d, Limit: %d\n",
     len1,len2,i);
 
+  /* set text up to the limit, select all the text, then add a char */
+  textlimit = 5;
+  memset(text, 'W', textlimit);
+  text[textlimit] = 0;
+  SendMessage(hwndRichEdit, EM_EXLIMITTEXT, 0, textlimit);
+  SendMessage(hwndRichEdit, WM_SETTEXT, 0, (LPARAM) text);
+  SendMessage(hwndRichEdit, EM_SETSEL, 0, -1);
+  SendMessage(hwndRichEdit, WM_CHAR, 'A', 1);
+  SendMessage(hwndRichEdit, WM_GETTEXT, 1024, (LPARAM) buffer);
+  result = strcmp(buffer, "A");
+  ok(0 == result, "got string = \"%s\"\n", buffer);
+
   DestroyWindow(hwndRichEdit);
 }
 


More information about the wine-patches mailing list