>From 3f883e4413864bb7cb568c1d35c1fd2830a54f4b Mon Sep 17 00:00:00 2001 From: James McKenzie Date: Sun, 11 Sep 2011 04:03:17 -0700 Subject: [PATCH] [richedit] Implment WB_DELIMITER using helper function To: wine-patches Reply-To: wine-devel Thanks to Dan Kegel for patch review. This patch implements the WB_DELIMITER function of EM_FINDWORDBREAK using the ME_IsADelimiter helper function. Based on one line of unpublished code of Dylan Smith. Code is/was located at: http://dylansmith.ca/git/?p=wine.git;a=commitdiff;h=3385057e0da77f15d35919e5dea5f9aa92efd8ae --- dlls/riched20/editor.c | 10 ++++++++-- dlls/riched20/string.c | 21 +++++++++++++++++---- dlls/riched20/tests/editor.c | 24 ++++++------------------ 3 files changed, 31 insertions(+), 24 deletions(-) diff --git a/dlls/riched20/editor.c b/dlls/riched20/editor.c index 3c409e4..2f78718 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 (parly done) - 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) @@ -4314,6 +4313,13 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam, editor->pfnWordBreak = (EDITWORDBREAKPROCW)lParam; return (LRESULT)pfnOld; } + case EM_FINDWORDBREAK: + { + ME_Cursor cursor; + ME_CursorFromCharOfs(editor, lParam, &cursor); + return ME_CallWordBreakProc(editor, cursor.pRun->member.run.strText, + cursor.nOffset, wParam); + } case EM_GETTEXTMODE: return editor->mode; case EM_SETTEXTMODE: diff --git a/dlls/riched20/string.c b/dlls/riched20/string.c index db45d92..ee4c0cb 100644 --- a/dlls/riched20/string.c +++ b/dlls/riched20/string.c @@ -175,19 +175,26 @@ int ME_ReverseFindWhitespaceV(const ME_String *s, int nVChar) { return i; } +static int +ME_IsDefaultDelimiter(WCHAR chr) +{ + if ((chr & 0xFF00) == 0xF000) /* for CP_SYMBOL */ + chr &= 0xFF; + return (chr == ' '); +} 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 +209,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 77ce09e..3e93fce 100644 --- a/dlls/riched20/tests/editor.c +++ b/dlls/riched20/tests/editor.c @@ -7083,15 +7083,9 @@ static void test_EM_FINDWORDBREAK_W(void) wbuf[1] = 0; 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); - else - 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); } DestroyWindow(hwndRichEdit); } @@ -7121,15 +7115,9 @@ static void test_EM_FINDWORDBREAK_A(void) buf[1] = 0; 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); - else - 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); } DestroyWindow(hwndRichEdit); } -- 1.7.6