richedit: EM_POSFROMCHAR should take into account scrollbar position. With tests.
This commit is contained in:
parent
3cc6e2365a
commit
acec891ac2
|
@ -2899,6 +2899,7 @@ static LRESULT RichEditWndProc_common(HWND hWnd, UINT msg, WPARAM wParam,
|
||||||
ME_DisplayItem *pRun;
|
ME_DisplayItem *pRun;
|
||||||
int nCharOfs, nOffset, nLength;
|
int nCharOfs, nOffset, nLength;
|
||||||
POINTL pt = {0,0};
|
POINTL pt = {0,0};
|
||||||
|
SCROLLINFO si;
|
||||||
|
|
||||||
nCharOfs = wParam;
|
nCharOfs = wParam;
|
||||||
/* detect which API version we're dealing with */
|
/* detect which API version we're dealing with */
|
||||||
|
@ -2917,6 +2918,14 @@ static LRESULT RichEditWndProc_common(HWND hWnd, UINT msg, WPARAM wParam,
|
||||||
pt.y = editor->pBuffer->pLast->member.para.nYPos;
|
pt.y = editor->pBuffer->pLast->member.para.nYPos;
|
||||||
}
|
}
|
||||||
pt.x += editor->selofs;
|
pt.x += editor->selofs;
|
||||||
|
|
||||||
|
si.cbSize = sizeof(si);
|
||||||
|
si.fMask = SIF_POS;
|
||||||
|
if (GetScrollInfo(editor->hWnd, SB_VERT, &si)) pt.y -= si.nPos;
|
||||||
|
si.cbSize = sizeof(si);
|
||||||
|
si.fMask = SIF_POS;
|
||||||
|
if (GetScrollInfo(editor->hWnd, SB_HORZ, &si)) pt.x -= si.nPos;
|
||||||
|
|
||||||
if (wParam >= 0x40000) {
|
if (wParam >= 0x40000) {
|
||||||
*(POINTL *)wParam = pt;
|
*(POINTL *)wParam = pt;
|
||||||
}
|
}
|
||||||
|
|
|
@ -400,10 +400,19 @@ static void test_EM_SCROLLCARET(void)
|
||||||
static void test_EM_POSFROMCHAR(void)
|
static void test_EM_POSFROMCHAR(void)
|
||||||
{
|
{
|
||||||
HWND hwndRichEdit = new_richedit(NULL);
|
HWND hwndRichEdit = new_richedit(NULL);
|
||||||
unsigned int i;
|
int i;
|
||||||
LRESULT result;
|
LRESULT result;
|
||||||
unsigned int height = 0;
|
unsigned int height = 0;
|
||||||
unsigned int xpos = 0;
|
int xpos = 0;
|
||||||
|
static const char text[] = "aa\n"
|
||||||
|
"this is a long line of text that should be longer than the "
|
||||||
|
"control's width\n"
|
||||||
|
"cc\n"
|
||||||
|
"dd\n"
|
||||||
|
"ee\n"
|
||||||
|
"ff\n"
|
||||||
|
"gg\n"
|
||||||
|
"hh\n";
|
||||||
|
|
||||||
/* Fill the control to lines to ensure that most of them are offscreen */
|
/* Fill the control to lines to ensure that most of them are offscreen */
|
||||||
for (i = 0; i < 50; i++)
|
for (i = 0; i < 50; i++)
|
||||||
|
@ -460,6 +469,48 @@ static void test_EM_POSFROMCHAR(void)
|
||||||
ok(HIWORD(result) == 50 * height, "EM_POSFROMCHAR reports y=%d, expected %d\n", HIWORD(result), 50 * height);
|
ok(HIWORD(result) == 50 * height, "EM_POSFROMCHAR reports y=%d, expected %d\n", HIWORD(result), 50 * height);
|
||||||
ok(LOWORD(result) == xpos, "EM_POSFROMCHAR reports x=%d, expected 1\n", LOWORD(result));
|
ok(LOWORD(result) == xpos, "EM_POSFROMCHAR reports x=%d, expected 1\n", LOWORD(result));
|
||||||
|
|
||||||
|
/* Testing that vertical scrolling does, in fact, have an effect on EM_POSFROMCHAR */
|
||||||
|
SendMessage(hwndRichEdit, EM_SCROLL, SB_LINEDOWN, 0); /* line down */
|
||||||
|
for (i = 0; i < 50; i++)
|
||||||
|
{
|
||||||
|
/* All the lines are 16 characters long */
|
||||||
|
result = SendMessage(hwndRichEdit, EM_POSFROMCHAR, i * 16, 0);
|
||||||
|
ok((signed short)(HIWORD(result)) == (i - 1) * height,
|
||||||
|
"EM_POSFROMCHAR reports y=%hd, expected %d\n",
|
||||||
|
(signed short)(HIWORD(result)), (i - 1) * height);
|
||||||
|
ok(LOWORD(result) == xpos, "EM_POSFROMCHAR reports x=%d, expected 1\n", LOWORD(result));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Testing position at end of text */
|
||||||
|
result = SendMessage(hwndRichEdit, EM_POSFROMCHAR, 50 * 16, 0);
|
||||||
|
ok(HIWORD(result) == (50 - 1) * height, "EM_POSFROMCHAR reports y=%d, expected %d\n", HIWORD(result), (50 - 1) * height);
|
||||||
|
ok(LOWORD(result) == xpos, "EM_POSFROMCHAR reports x=%d, expected 1\n", LOWORD(result));
|
||||||
|
|
||||||
|
/* Testing position way past end of text */
|
||||||
|
result = SendMessage(hwndRichEdit, EM_POSFROMCHAR, 55 * 16, 0);
|
||||||
|
ok(HIWORD(result) == (50 - 1) * height, "EM_POSFROMCHAR reports y=%d, expected %d\n", HIWORD(result), (50 - 1) * height);
|
||||||
|
ok(LOWORD(result) == xpos, "EM_POSFROMCHAR reports x=%d, expected 1\n", LOWORD(result));
|
||||||
|
|
||||||
|
/* Testing that horizontal scrolling does, in fact, have an effect on EM_POSFROMCHAR */
|
||||||
|
SendMessage(hwndRichEdit, WM_SETTEXT, 0, (LPARAM) text);
|
||||||
|
SendMessage(hwndRichEdit, EM_SCROLL, SB_LINEUP, 0); /* line up */
|
||||||
|
|
||||||
|
result = SendMessage(hwndRichEdit, EM_POSFROMCHAR, 0, 0);
|
||||||
|
ok(HIWORD(result) == 0, "EM_POSFROMCHAR reports y=%d, expected 0\n", HIWORD(result));
|
||||||
|
todo_wine {
|
||||||
|
ok(LOWORD(result) == 1, "EM_POSFROMCHAR reports x=%d, expected 1\n", LOWORD(result));
|
||||||
|
}
|
||||||
|
xpos = LOWORD(result);
|
||||||
|
|
||||||
|
SendMessage(hwndRichEdit, WM_HSCROLL, SB_LINERIGHT, 0);
|
||||||
|
result = SendMessage(hwndRichEdit, EM_POSFROMCHAR, 0, 0);
|
||||||
|
ok(HIWORD(result) == 0, "EM_POSFROMCHAR reports y=%d, expected 0\n", HIWORD(result));
|
||||||
|
todo_wine {
|
||||||
|
/* Fails on builtin because horizontal scrollbar is not being shown */
|
||||||
|
ok((signed short)(LOWORD(result)) < xpos,
|
||||||
|
"EM_POSFROMCHAR reports x=%hd, expected value less than %d\n",
|
||||||
|
(signed short)(LOWORD(result)), xpos);
|
||||||
|
}
|
||||||
DestroyWindow(hwndRichEdit);
|
DestroyWindow(hwndRichEdit);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -699,11 +699,20 @@ static void test_EM_FINDTEXT(void)
|
||||||
static void test_EM_POSFROMCHAR(void)
|
static void test_EM_POSFROMCHAR(void)
|
||||||
{
|
{
|
||||||
HWND hwndRichEdit = new_richedit(NULL);
|
HWND hwndRichEdit = new_richedit(NULL);
|
||||||
unsigned int i;
|
int i;
|
||||||
POINTL pl;
|
POINTL pl;
|
||||||
LRESULT result;
|
LRESULT result;
|
||||||
unsigned int height = 0;
|
unsigned int height = 0;
|
||||||
unsigned int xpos = 0;
|
int xpos = 0;
|
||||||
|
static const char text[] = "aa\n"
|
||||||
|
"this is a long line of text that should be longer than the "
|
||||||
|
"control's width\n"
|
||||||
|
"cc\n"
|
||||||
|
"dd\n"
|
||||||
|
"ee\n"
|
||||||
|
"ff\n"
|
||||||
|
"gg\n"
|
||||||
|
"hh\n";
|
||||||
|
|
||||||
/* Fill the control to lines to ensure that most of them are offscreen */
|
/* Fill the control to lines to ensure that most of them are offscreen */
|
||||||
for (i = 0; i < 50; i++)
|
for (i = 0; i < 50; i++)
|
||||||
|
@ -763,6 +772,52 @@ static void test_EM_POSFROMCHAR(void)
|
||||||
ok(pl.y == 50 * height, "EM_POSFROMCHAR reports y=%d, expected %d\n", pl.y, 50 * height);
|
ok(pl.y == 50 * height, "EM_POSFROMCHAR reports y=%d, expected %d\n", pl.y, 50 * height);
|
||||||
ok(pl.x == xpos, "EM_POSFROMCHAR reports x=%d, expected 1\n", pl.x);
|
ok(pl.x == xpos, "EM_POSFROMCHAR reports x=%d, expected 1\n", pl.x);
|
||||||
|
|
||||||
|
|
||||||
|
/* Testing that vertical scrolling does, in fact, have an effect on EM_POSFROMCHAR */
|
||||||
|
SendMessage(hwndRichEdit, EM_SCROLL, SB_LINEDOWN, 0); /* line down */
|
||||||
|
for (i = 0; i < 50; i++)
|
||||||
|
{
|
||||||
|
/* All the lines are 16 characters long */
|
||||||
|
result = SendMessage(hwndRichEdit, EM_POSFROMCHAR, (WPARAM)&pl, i * 16);
|
||||||
|
ok(result == 0, "EM_POSFROMCHAR returned %ld, expected 0\n", result);
|
||||||
|
ok(pl.y == (i - 1) * height,
|
||||||
|
"EM_POSFROMCHAR reports y=%d, expected %d\n",
|
||||||
|
pl.y, (i - 1) * height);
|
||||||
|
ok(pl.x == xpos, "EM_POSFROMCHAR reports x=%d, expected 1\n", pl.x);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Testing position at end of text */
|
||||||
|
result = SendMessage(hwndRichEdit, EM_POSFROMCHAR, (WPARAM)&pl, 50 * 16);
|
||||||
|
ok(result == 0, "EM_POSFROMCHAR returned %ld, expected 0\n", result);
|
||||||
|
ok(pl.y == (50 - 1) * height, "EM_POSFROMCHAR reports y=%d, expected %d\n", pl.y, (50 - 1) * height);
|
||||||
|
ok(pl.x == xpos, "EM_POSFROMCHAR reports x=%d, expected 1\n", pl.x);
|
||||||
|
|
||||||
|
/* Testing position way past end of text */
|
||||||
|
result = SendMessage(hwndRichEdit, EM_POSFROMCHAR, (WPARAM)&pl, 55 * 16);
|
||||||
|
ok(result == 0, "EM_POSFROMCHAR returned %ld, expected 0\n", result);
|
||||||
|
ok(pl.y == (50 - 1) * height, "EM_POSFROMCHAR reports y=%d, expected %d\n", pl.y, (50 - 1) * height);
|
||||||
|
ok(pl.x == xpos, "EM_POSFROMCHAR reports x=%d, expected 1\n", pl.x);
|
||||||
|
|
||||||
|
/* Testing that horizontal scrolling does, in fact, have an effect on EM_POSFROMCHAR */
|
||||||
|
SendMessage(hwndRichEdit, WM_SETTEXT, 0, (LPARAM) text);
|
||||||
|
SendMessage(hwndRichEdit, EM_SCROLL, SB_LINEUP, 0); /* line up */
|
||||||
|
|
||||||
|
result = SendMessage(hwndRichEdit, EM_POSFROMCHAR, (WPARAM)&pl, 0);
|
||||||
|
ok(result == 0, "EM_POSFROMCHAR returned %ld, expected 0\n", result);
|
||||||
|
ok(pl.y == 0, "EM_POSFROMCHAR reports y=%d, expected 0\n", pl.y);
|
||||||
|
todo_wine {
|
||||||
|
ok(pl.x == 1, "EM_POSFROMCHAR reports x=%d, expected 1\n", pl.x);
|
||||||
|
}
|
||||||
|
xpos = pl.x;
|
||||||
|
|
||||||
|
SendMessage(hwndRichEdit, WM_HSCROLL, SB_LINERIGHT, 0);
|
||||||
|
result = SendMessage(hwndRichEdit, EM_POSFROMCHAR, (WPARAM)&pl, 0);
|
||||||
|
ok(result == 0, "EM_POSFROMCHAR returned %ld, expected 0\n", result);
|
||||||
|
ok(pl.y == 0, "EM_POSFROMCHAR reports y=%d, expected 0\n", pl.y);
|
||||||
|
todo_wine {
|
||||||
|
/* Fails on builtin because horizontal scrollbar is not being shown */
|
||||||
|
ok(pl.x < xpos, "EM_POSFROMCHAR reports x=%hd, expected value less than %d\n", pl.x, xpos);
|
||||||
|
}
|
||||||
DestroyWindow(hwndRichEdit);
|
DestroyWindow(hwndRichEdit);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue