richedit: Implement WB_DELIMITER and remove todo_wines in tests.Based on unpublished code of Dylan Smith.Addresses issues with initial code through simplification.Sets remaining EM_FINDWORDBREAK actions to a FIXME.

James McKenzie jjmckenzie51 at gmail.com
Sat Jul 23 19:19:33 CDT 2011


---
 dlls/riched20/editor.c       |   39 +++++++++++++++++++++++++++++++++++++--
 dlls/riched20/string.c       |   22 ++++++++++++++++++----
 dlls/riched20/tests/editor.c |   14 ++++++--------
 3 files changed, 61 insertions(+), 14 deletions(-)

diff --git a/dlls/riched20/editor.c b/dlls/riched20/editor.c
index 3c409e4..025d067 100644
--- a/dlls/riched20/editor.c
+++ b/dlls/riched20/editor.c
@@ -38,7 +38,7 @@
   + EM_EXSETSEL
   + EM_FINDTEXT (only FR_DOWN flag implemented)
   + EM_FINDTEXTEX (only FR_DOWN flag implemented)
-  - EM_FINDWORDBREAK
+  + EM_FINDWORDBREAK (Partial implementation)
   - EM_FMTLINES
   - EM_FORMATRANGE
   + EM_GETAUTOURLDETECT 2.0
@@ -3007,7 +3007,6 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam,
   switch(msg) {
 
   UNSUPPORTED_MSG(EM_DISPLAYBAND)
-  UNSUPPORTED_MSG(EM_FINDWORDBREAK)
   UNSUPPORTED_MSG(EM_FMTLINES)
   UNSUPPORTED_MSG(EM_FORMATRANGE)
   UNSUPPORTED_MSG(EM_GETBIDIOPTIONS)
@@ -4378,6 +4377,42 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam,
       FIXME("EM_SETTARGETDEVICE doesn't use non-NULL target devices\n");
     }
     return TRUE;
+  case EM_FINDWORDBREAK:
+  {
+    ME_Cursor cursor;
+
+    ME_CursorFromCharOfs(editor, lParam, &cursor);
+    switch(wParam)
+    {
+      case WB_ISDELIMITER:
+        return ME_CallWordBreakProc(editor, cursor.pRun->member.run.strText,
+                                    cursor.nOffset, wParam);
+      case WB_CLASSIFY:
+        FIXME("WB_CLASSIFY not yet implemented\n");
+        break;
+      case WB_LEFT:
+        FIXME("WB_LEFT not yet implemented\n");
+        break;
+      case WB_RIGHT:
+        FIXME("WB_RIGHT not yet implemented\n");
+        break;
+      case WB_MOVEWORDLEFT:
+        FIXME("WB_MOVEWORDLEFT not implemented\n");
+        break;
+      case WB_MOVEWORDRIGHT:
+        FIXME("WB_MOVEWORDRIGHT not implemented\n");
+        break;
+      case WB_LEFTBREAK:
+        FIXME("WB_LEFT/PREVBREAK not implemented\n");
+        break;
+      case WB_RIGHTBREAK:
+        FIXME("WB_RIGHT/NEXTBREAK not implemented\n");
+        break;
+      default:
+        FIXME("Unknown EM_FINDWORDBREAK code %d\n", (int)wParam);
+        return -1;
+    }
+  }
   default:
   do_default:
     *phresult = S_FALSE;
diff --git a/dlls/riched20/string.c b/dlls/riched20/string.c
index db45d92..5424b8f 100644
--- a/dlls/riched20/string.c
+++ b/dlls/riched20/string.c
@@ -175,19 +175,27 @@ int ME_ReverseFindWhitespaceV(const ME_String *s, int nVChar) {
   return i;
 }
 
+static int
+ME_IsDefaultDelimiter(WCHAR c)
+{
+  return (
+      c == 0x20   ||  /* normal space */
+      c == 0xf020     /* Windows translates space from CP_SYMBOL to u+f020 */
+  );
+}
 
 static int
 ME_WordBreakProc(LPWSTR s, INT start, INT len, INT code)
 {
-  /* FIXME: Native also knows about punctuation */
-  TRACE("s==%s, start==%d, len==%d, code==%d\n",
-        debugstr_wn(s, len), start, len, code);
   /* convert number of bytes to number of characters. */
   len /= sizeof(WCHAR);
+  TRACE("s==%s, start==%d, len==%d, code==%d\n",
+        debugstr_wn(s, len), start, len, code);
   switch (code)
   {
     case WB_ISDELIMITER:
-      return ME_IsWSpace(s[start]);
+      return ME_IsDefaultDelimiter(s[start]);
+      break;
     case WB_LEFT:
     case WB_MOVEWORDLEFT:
       while (start && ME_IsWSpace(s[start - 1]))
@@ -202,6 +210,12 @@ ME_WordBreakProc(LPWSTR s, INT start, INT len, INT code)
       while (start < len && ME_IsWSpace(s[start]))
         start++;
       return start;
+    case WB_CLASSIFY:
+    case WB_LEFTBREAK:
+    case WB_RIGHTBREAK:
+    default:
+      FIXME("Unimplemented EM_FINDWORDBREAK function\n");
+      return -1;
   }
   return 0;
 }
diff --git a/dlls/riched20/tests/editor.c b/dlls/riched20/tests/editor.c
index 6bc2d6b..8472ff9 100644
--- a/dlls/riched20/tests/editor.c
+++ b/dlls/riched20/tests/editor.c
@@ -7084,10 +7084,9 @@ static void test_EM_FINDWORDBREAK_W(void)
         SendMessageW(hwndRichEdit, WM_SETTEXT, 0, (LPARAM)wbuf);
         result = SendMessageW(hwndRichEdit, EM_FINDWORDBREAK, WB_ISDELIMITER,0);
         if (wbuf[0] == 0x20 || wbuf[0] == 0xf020)
-            todo_wine
-                ok(result == delimiter_tests[i].isdelimiter,
-                   "wanted ISDELIMITER_W(0x%x) %d, got %d\n",
-                   delimiter_tests[i].c, delimiter_tests[i].isdelimiter,result);
+            ok(result == delimiter_tests[i].isdelimiter,
+               "wanted ISDELIMITER_W(0x%x) %d, got %d\n",
+               delimiter_tests[i].c, delimiter_tests[i].isdelimiter,result);
         else
             ok(result == delimiter_tests[i].isdelimiter,
                "wanted ISDELIMITER_W(0x%x) %d, got %d\n",
@@ -7122,10 +7121,9 @@ static void test_EM_FINDWORDBREAK_A(void)
         SendMessageW(hwndRichEdit, WM_SETTEXT, 0, (LPARAM)buf);
         result = SendMessage(hwndRichEdit, EM_FINDWORDBREAK, WB_ISDELIMITER, 0);
         if (buf[0] == 0x20)
-            todo_wine
-                ok(result == delimiter_tests[i].isdelimiter,
-                   "wanted ISDELIMITER_A(0x%x) %d, got %d\n",
-                   delimiter_tests[i].c, delimiter_tests[i].isdelimiter,result);
+            ok(result == delimiter_tests[i].isdelimiter,
+               "wanted ISDELIMITER_A(0x%x) %d, got %d\n",
+               delimiter_tests[i].c, delimiter_tests[i].isdelimiter,result);
         else
             ok(result == delimiter_tests[i].isdelimiter,
                "wanted ISDELIMITER_A(0x%x) %d, got %d\n",
-- 
1.7.6


--------------080707010401030906040903--



More information about the wine-patches mailing list