[PATCH] richedit: EM_POSFROMCHAR should take into account scrollbar position. With tests.
Alex Villacís Lasso
alex at karlalex.palosanto.com
Sat Jun 21 15:50:12 CDT 2008
---
dlls/riched20/editor.c | 9 ++++++
dlls/riched20/tests/editor.c | 55 +++++++++++++++++++++++++++++++++++++-
dlls/riched32/tests/editor.c | 59 ++++++++++++++++++++++++++++++++++++++++-
3 files changed, 119 insertions(+), 4 deletions(-)
diff --git a/dlls/riched20/editor.c b/dlls/riched20/editor.c
index 0539d76..6bcdc51 100644
--- a/dlls/riched20/editor.c
+++ b/dlls/riched20/editor.c
@@ -2899,6 +2899,7 @@ static LRESULT RichEditWndProc_common(HWND hWnd, UINT msg, WPARAM wParam,
ME_DisplayItem *pRun;
int nCharOfs, nOffset, nLength;
POINTL pt = {0,0};
+ SCROLLINFO si;
nCharOfs = wParam;
/* 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.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) {
*(POINTL *)wParam = pt;
}
diff --git a/dlls/riched20/tests/editor.c b/dlls/riched20/tests/editor.c
index 5ae2e13..fffd7ab 100644
--- a/dlls/riched20/tests/editor.c
+++ b/dlls/riched20/tests/editor.c
@@ -400,11 +400,20 @@ static void test_EM_SCROLLCARET(void)
static void test_EM_POSFROMCHAR(void)
{
HWND hwndRichEdit = new_richedit(NULL);
- unsigned int i;
+ int i;
POINTL pl;
LRESULT result;
unsigned int height = 0;
- unsigned int xpos = 0;
+ int xpos = 0;
+ 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 */
for (i = 0; i < 50; i++)
@@ -461,6 +470,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(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);
}
diff --git a/dlls/riched32/tests/editor.c b/dlls/riched32/tests/editor.c
index 56bb100..eed6821 100644
--- a/dlls/riched32/tests/editor.c
+++ b/dlls/riched32/tests/editor.c
@@ -699,11 +699,20 @@ static void test_EM_FINDTEXT(void)
static void test_EM_POSFROMCHAR(void)
{
HWND hwndRichEdit = new_richedit(NULL);
- unsigned int i;
+ int i;
POINTL pl;
LRESULT result;
unsigned int height = 0;
- unsigned int xpos = 0;
+ int xpos = 0;
+ 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 */
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.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);
}
--
1.5.4.1
--------------070302080100010801070203--
More information about the wine-patches
mailing list