richedit: Return correct values when EM_SETTEXTMODE fails.

The checks for the text length and invalid parameters needed to be swapped,
and the code could be easily simplified.
This commit is contained in:
Dylan Smith 2010-07-29 14:02:32 -04:00 committed by Alexandre Julliard
parent 428e8a5a01
commit 75eef41881
2 changed files with 21 additions and 25 deletions

View File

@ -4316,36 +4316,26 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam,
return editor->mode;
case EM_SETTEXTMODE:
{
LRESULT ret;
int mask = 0;
int changes = 0;
GETTEXTLENGTHEX how;
/* CR/LF conversion required in 2.0 mode, verbatim in 1.0 mode */
how.flags = GTL_CLOSE | (editor->bEmulateVersion10 ? 0 : GTL_USECRLF) | GTL_NUMCHARS;
how.codepage = unicode ? 1200 : CP_ACP;
ret = ME_GetTextLengthEx(editor, &how);
if (!ret)
{
/*Check for valid wParam*/
if ((((wParam & TM_RICHTEXT) && ((wParam & TM_PLAINTEXT) << 1))) ||
(((wParam & TM_MULTILEVELUNDO) && ((wParam & TM_SINGLELEVELUNDO) << 1))) ||
(((wParam & TM_MULTICODEPAGE) && ((wParam & TM_SINGLECODEPAGE) << 1))))
return 1;
else
{
if (ME_GetTextLength(editor))
return E_UNEXPECTED;
/* Check for mutually exclusive flags in adjacent bits of wParam */
if ((wParam & (TM_RICHTEXT | TM_MULTILEVELUNDO | TM_MULTICODEPAGE)) &
(wParam & (TM_PLAINTEXT | TM_SINGLELEVELUNDO | TM_SINGLECODEPAGE)) << 1)
return E_INVALIDARG;
if (wParam & (TM_RICHTEXT | TM_PLAINTEXT))
{
mask |= (TM_RICHTEXT | TM_PLAINTEXT);
changes |= (wParam & (TM_RICHTEXT | TM_PLAINTEXT));
mask |= TM_RICHTEXT | TM_PLAINTEXT;
changes |= wParam & (TM_RICHTEXT | TM_PLAINTEXT);
}
/* FIXME: Currently no support for undo level and code page options */
editor->mode = (editor->mode & (~mask)) | changes;
editor->mode = (editor->mode & ~mask) | changes;
return 0;
}
}
return ret;
}
case EM_SETPASSWORDCHAR:
{
editor->cPasswordMask = wParam;

View File

@ -1053,6 +1053,11 @@ static void test_EM_SETTEXTMODE(void)
CHARRANGE cr;
int rc = 0;
/*Attempt to use mutually exclusive modes*/
rc = SendMessage(hwndRichEdit, EM_SETTEXTMODE, (WPARAM) TM_PLAINTEXT|TM_RICHTEXT, 0);
ok(rc == E_INVALIDARG,
"EM_SETTEXTMODE: using mutually exclusive mode flags - returned: %x\n", rc);
/*Test that EM_SETTEXTMODE fails if text exists within the control*/
/*Insert text into the control*/
@ -1060,7 +1065,8 @@ static void test_EM_SETTEXTMODE(void)
/*Attempt to change the control to plain text mode*/
rc = SendMessage(hwndRichEdit, EM_SETTEXTMODE, (WPARAM) TM_PLAINTEXT, 0);
ok(rc != 0, "EM_SETTEXTMODE: changed text mode in control containing text - returned: %d\n", rc);
ok(rc == E_UNEXPECTED,
"EM_SETTEXTMODE: changed text mode in control containing text - returned: %x\n", rc);
/*Test that EM_SETTEXTMODE does not allow rich edit text to be pasted.
If rich text is pasted, it should have the same formatting as the rest