Alex Villacís Lasso : riched20: EM_SETTEXTEX supports RTF strings, with tests.
Alexandre Julliard
julliard at winehq.org
Tue Apr 22 06:47:04 CDT 2008
Module: wine
Branch: master
Commit: 46ff4a6f165c55570324ff87d7a4bdd939d6e4b7
URL: http://source.winehq.org/git/wine.git/?a=commit;h=46ff4a6f165c55570324ff87d7a4bdd939d6e4b7
Author: Alex Villacís Lasso <a_villacis at palosanto.com>
Date: Mon Apr 21 10:05:31 2008 -0500
riched20: EM_SETTEXTEX supports RTF strings, with tests.
---
dlls/riched20/editor.c | 11 +++++---
dlls/riched20/tests/editor.c | 56 ++++++++++++++++++++++++++++++++++++++++++
2 files changed, 63 insertions(+), 4 deletions(-)
diff --git a/dlls/riched20/editor.c b/dlls/riched20/editor.c
index 7eaf769..42f7216 100644
--- a/dlls/riched20/editor.c
+++ b/dlls/riched20/editor.c
@@ -115,7 +115,7 @@
+ EM_SETSCROLLPOS 3.0
- EM_SETTABSTOPS 3.0
- EM_SETTARGETDEVICE (partial)
- + EM_SETTEXTEX 3.0 (no rich text insertion handling, proper style?)
+ + EM_SETTEXTEX 3.0 (proper style?)
- EM_SETTEXTMODE 2.0
- EM_SETTYPOGRAPHYOPTIONS 3.0
+ EM_SETUNDOLIMIT 2.0
@@ -2117,17 +2117,20 @@ static LRESULT RichEditWndProc_common(HWND hWnd, UINT msg, WPARAM wParam,
wszText = lParam ? ME_ToUnicode(pStruct->codepage == 1200, (void *)lParam) : NULL;
len = wszText ? lstrlenW(wszText) : 0;
- /* FIXME: this should support RTF strings too, according to MSDN */
if (pStruct->flags & ST_SELECTION) {
ME_GetSelection(editor, &from, &to);
style = ME_GetSelectionInsertStyle(editor);
ME_InternalDeleteText(editor, from, to - from);
- ME_InsertTextFromCursor(editor, 0, wszText, len, style);
+ if (pStruct->codepage != 1200 && lParam && !strncmp((char *)lParam, "{\\rtf", 5))
+ ME_StreamInRTFString(editor, 0, (char *)lParam);
+ else ME_InsertTextFromCursor(editor, 0, wszText, len, style);
ME_ReleaseStyle(style);
}
else {
ME_InternalDeleteText(editor, 0, ME_GetTextLength(editor));
- ME_InsertTextFromCursor(editor, 0, wszText, len, editor->pBuffer->pDefaultStyle);
+ if (pStruct->codepage != 1200 && lParam && !strncmp((char *)lParam, "{\\rtf", 5))
+ ME_StreamInRTFString(editor, 0, (char *)lParam);
+ else ME_InsertTextFromCursor(editor, 0, wszText, len, editor->pBuffer->pDefaultStyle);
len = 1;
}
ME_CommitUndo(editor);
diff --git a/dlls/riched20/tests/editor.c b/dlls/riched20/tests/editor.c
index b97e458..dd7640c 100644
--- a/dlls/riched20/tests/editor.c
+++ b/dlls/riched20/tests/editor.c
@@ -1041,6 +1041,20 @@ static void test_ES_PASSWORD(void)
DestroyWindow(hwndRichEdit);
}
+static DWORD CALLBACK test_WM_SETTEXT_esCallback(DWORD_PTR dwCookie,
+ LPBYTE pbBuff,
+ LONG cb,
+ LONG *pcb)
+{
+ char** str = (char**)dwCookie;
+ *pcb = cb;
+ if (*pcb > 0) {
+ memcpy(*str, pbBuff, *pcb);
+ *str += *pcb;
+ }
+ return 0;
+}
+
static void test_WM_SETTEXT()
{
HWND hwndRichEdit = new_richedit(NULL);
@@ -1057,8 +1071,11 @@ static void test_WM_SETTEXT()
const char * TestItem6_after = "TestSomeText \r\nTestSomeText";
const char * TestItem7 = "TestSomeText\r\n\r\r\n\rTestSomeText";
const char * TestItem7_after = "TestSomeText\r\n \r\nTestSomeText";
+
char buf[1024] = {0};
LRESULT result;
+ EDITSTREAM es;
+ char * p;
/* This test attempts to show that WM_SETTEXT on a riched20 control causes
any solitary \r to be converted to \r\n on return. Properly paired
@@ -1086,6 +1103,18 @@ static void test_WM_SETTEXT()
TEST_SETTEXT(TestItem6, TestItem6_after)
TEST_SETTEXT(TestItem7, TestItem7_after)
+ /* The following test demonstrates that WM_SETTEXT supports RTF strings */
+ SendMessage(hwndRichEdit, WM_SETTEXT, 0, (LPARAM) TestItem1);
+ p = buf;
+ es.dwCookie = (DWORD_PTR)&p;
+ es.dwError = 0;
+ es.pfnCallback = test_WM_SETTEXT_esCallback;
+ memset(buf, 0, sizeof(buf));
+ SendMessage(hwndRichEdit, EM_STREAMOUT,
+ (WPARAM)(SF_RTF), (LPARAM)&es);
+ trace("EM_STREAMOUT produced: \n%s\n", buf);
+ TEST_SETTEXT(buf, TestItem1)
+
#undef TEST_SETTEXT
DestroyWindow(hwndRichEdit);
}
@@ -1126,8 +1155,10 @@ static void test_EM_SETTEXTEX(void)
' ','\r', 0};
#define MAX_BUF_LEN 1024
WCHAR buf[MAX_BUF_LEN];
+ char * p;
int result;
CHARRANGE cr;
+ EDITSTREAM es;
setText.codepage = 1200; /* no constant for unicode */
getText.codepage = 1200; /* no constant for unicode */
@@ -1274,6 +1305,31 @@ static void test_EM_SETTEXTEX(void)
"EM_SETTEXTEX to replace selection with more text failed: %i.\n",
lstrlenW(buf) );
+ /* The following test demonstrates that EM_SETTEXTEX supports RTF strings */
+ SendMessage(hwndRichEdit, WM_SETTEXT, 0, (LPARAM) "TestSomeText"); /* TestItem1 */
+ p = (char *)buf;
+ es.dwCookie = (DWORD_PTR)&p;
+ es.dwError = 0;
+ es.pfnCallback = test_WM_SETTEXT_esCallback;
+ memset(buf, 0, sizeof(buf));
+ SendMessage(hwndRichEdit, EM_STREAMOUT,
+ (WPARAM)(SF_RTF), (LPARAM)&es);
+ trace("EM_STREAMOUT produced: \n%s\n", (char *)buf);
+
+ setText.codepage = CP_ACP;/* EM_STREAMOUT saved as ANSI string */
+ getText.codepage = 1200; /* no constant for unicode */
+ getText.cb = MAX_BUF_LEN;
+ getText.flags = GT_DEFAULT;
+ getText.lpDefaultChar = NULL;
+ getText.lpUsedDefChar = NULL;
+
+ setText.flags = 0;
+ SendMessage(hwndRichEdit, EM_SETTEXTEX, (WPARAM)&setText, (LPARAM) buf);
+ SendMessage(hwndRichEdit, EM_GETTEXTEX, (WPARAM)&getText, (LPARAM) buf);
+ ok(lstrcmpW(buf, TestItem1) == 0,
+ "EM_GETTEXTEX results not what was set by EM_SETTEXTEX\n");
+
+
DestroyWindow(hwndRichEdit);
}
More information about the wine-cvs
mailing list