Module: wine Branch: master Commit: b4babc16bbcb610dbe17f526c5ecd30041629362 URL: http://source.winehq.org/git/wine.git/?a=commit;h=b4babc16bbcb610dbe17f526c5...
Author: Dylan Smith dylan.ah.smith@gmail.com Date: Fri Jan 16 20:38:24 2009 -0500
richedit: EM_SETTEXTEX detects ascii richtext with Unicode codepage.
---
dlls/riched20/editor.c | 56 ++++++++++++++++++++++++++--------------- dlls/riched20/tests/editor.c | 3 +- 2 files changed, 36 insertions(+), 23 deletions(-)
diff --git a/dlls/riched20/editor.c b/dlls/riched20/editor.c index b67ca60..e3920d4 100644 --- a/dlls/riched20/editor.c +++ b/dlls/riched20/editor.c @@ -3208,42 +3208,56 @@ static LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam, { LPWSTR wszText; SETTEXTEX *pStruct = (SETTEXTEX *)wParam; - size_t len; + size_t len = 0; int from, to; ME_Style *style; + BOOL bRtf, bUnicode, bSelection; int oldModify = editor->nModifyStep;
if (!pStruct) return 0;
+ /* If we detect ascii rtf at the start of the string, + * we know it isn't unicode. */ + bRtf = (lParam && (!strncmp((char *)lParam, "{\rtf", 5) || + !strncmp((char *)lParam, "{\urtf}", 6))); + bUnicode = !bRtf && pStruct->codepage == 1200; + TRACE("EM_SETTEXTEX - %s, flags %d, cp %d\n", - pStruct->codepage == 1200 ? debugstr_w((LPCWSTR)lParam) : debugstr_a((LPCSTR)lParam), + bUnicode ? debugstr_w((LPCWSTR)lParam) : debugstr_a((LPCSTR)lParam), pStruct->flags, pStruct->codepage);
- /* FIXME: make use of pStruct->codepage in the to unicode translation */ - wszText = lParam ? ME_ToUnicode(pStruct->codepage == 1200, (void *)lParam) : NULL; - len = wszText ? lstrlenW(wszText) : 0; - - if (pStruct->flags & ST_SELECTION) { + bSelection = (pStruct->flags & ST_SELECTION) != 0; + if (bSelection) { ME_GetSelection(editor, &from, &to); style = ME_GetSelectionInsertStyle(editor); ME_InternalDeleteText(editor, from, to - from, FALSE); - if (pStruct->codepage != 1200 && lParam && - (!strncmp((char *)lParam, "{\rtf", 5) || !strncmp((char *)lParam, "{\urtf}", 6))) - ME_StreamInRTFString(editor, 1, (char *)lParam); - else ME_InsertTextFromCursor(editor, 0, wszText, len, style); - ME_ReleaseStyle(style); + } else { + ME_InternalDeleteText(editor, 0, ME_GetTextLength(editor), FALSE); + style = editor->pBuffer->pDefaultStyle; + }
- if (editor->AutoURLDetect_bEnable) ME_UpdateSelectionLinkAttribute(editor); + if (bRtf) { + ME_StreamInRTFString(editor, bSelection, (char *)lParam); + if (bSelection) { + /* FIXME: The length returned is doesn't include the rtf control + * characters, only the actual text. */ + len = lParam ? strlen((char *)lParam) : 0; + } + } else { + /* FIXME: make use of pStruct->codepage in the to unicode translation */ + wszText = lParam ? ME_ToUnicode(bUnicode, (void *)lParam) : NULL; + len = wszText ? lstrlenW(wszText) : 0; + ME_InsertTextFromCursor(editor, 0, wszText, len, style); } - else { - ME_InternalDeleteText(editor, 0, ME_GetTextLength(editor), FALSE); - if (pStruct->codepage != 1200 && lParam && - (!strncmp((char *)lParam, "{\rtf", 5) || !strncmp((char *)lParam, "{\urtf}", 6))) - ME_StreamInRTFString(editor, 0, (char *)lParam); - else ME_InsertTextFromCursor(editor, 0, wszText, len, editor->pBuffer->pDefaultStyle); - len = 1;
- if (editor->AutoURLDetect_bEnable) ME_UpdateLinkAttribute(editor, 0, -1); + if (bSelection) { + ME_ReleaseStyle(style); + if (editor->AutoURLDetect_bEnable) + ME_UpdateSelectionLinkAttribute(editor); + } else { + len = 1; + if (editor->AutoURLDetect_bEnable) + ME_UpdateLinkAttribute(editor, 0, -1); } ME_CommitUndo(editor); if (!(pStruct->flags & ST_KEEPUNDO)) diff --git a/dlls/riched20/tests/editor.c b/dlls/riched20/tests/editor.c index 2cf9a10..1d5a04d 100644 --- a/dlls/riched20/tests/editor.c +++ b/dlls/riched20/tests/editor.c @@ -3576,8 +3576,7 @@ static void test_EM_SETTEXTEX(void) result = SendMessage(hwndRichEdit, EM_SETTEXTEX, (WPARAM)&setText, (LPARAM) "{\rtf not unicode}"); todo_wine ok(result == 11, "EM_SETTEXTEX incorrectly returned %d\n", result); SendMessage(hwndRichEdit, EM_GETTEXTEX, (WPARAM)&getText, (LPARAM) bufACP); - todo_wine ok(lstrcmpA(bufACP, "not unicode") == 0, - "'%s' != 'not unicode'\n", bufACP); + ok(lstrcmpA(bufACP, "not unicode") == 0, "'%s' != 'not unicode'\n", bufACP);
/* The following test demonstrates that EM_SETTEXTEX supports RTF strings with a selection */ SendMessage(hwndRichEdit, WM_SETTEXT, 0, (LPARAM) "TestSomeText"); /* TestItem1 */