Module: wine Branch: master Commit: 02228ee176a2e1403cb4320b13febe6d9b0b5179 URL: http://source.winehq.org/git/wine.git/?a=commit;h=02228ee176a2e1403cb4320b13...
Author: Dylan Smith dylan.ah.smith@gmail.com Date: Thu Aug 13 08:44:09 2009 -0400
richedit: Use ME_Cursor instead of offsets for ME_CharFromPos.
---
dlls/riched20/caret.c | 16 +++++++++------- dlls/riched20/editor.c | 32 ++++++++++++++++++-------------- dlls/riched20/editor.h | 2 +- 3 files changed, 28 insertions(+), 22 deletions(-)
diff --git a/dlls/riched20/caret.c b/dlls/riched20/caret.c index 0cece5e..fe594a0 100644 --- a/dlls/riched20/caret.c +++ b/dlls/riched20/caret.c @@ -1004,30 +1004,32 @@ static BOOL ME_FindPixelPos(ME_TextEditor *editor, int x, int y, }
-/* Returns the character offset closest to the pixel position +/* Sets the cursor to the position closest to the pixel position * * x & y are pixel positions in client coordinates. * * isExact will be set to TRUE if the run is directly under the pixel * position, FALSE if it not, unless isExact is set to NULL. + * + * return FALSE if outside client area and the cursor is not set, + * otherwise TRUE is returned. */ -int ME_CharFromPos(ME_TextEditor *editor, int x, int y, BOOL *isExact) +BOOL ME_CharFromPos(ME_TextEditor *editor, int x, int y, + ME_Cursor *cursor, BOOL *isExact) { - ME_Cursor cursor; RECT rc; BOOL bResult;
ITextHost_TxGetClientRect(editor->texthost, &rc); if (x < 0 || y < 0 || x >= rc.right || y >= rc.bottom) { if (isExact) *isExact = FALSE; - return -1; + return FALSE; } x += editor->horz_si.nPos; y += editor->vert_si.nPos; - bResult = ME_FindPixelPos(editor, x, y, &cursor, NULL); + bResult = ME_FindPixelPos(editor, x, y, cursor, NULL); if (isExact) *isExact = bResult; - return cursor.pPara->member.para.nCharOfs - + cursor.pRun->member.run.nCharOfs + cursor.nOffset; + return TRUE; }
diff --git a/dlls/riched20/editor.c b/dlls/riched20/editor.c index 0b7ee7f..e56d8d4 100644 --- a/dlls/riched20/editor.c +++ b/dlls/riched20/editor.c @@ -2476,9 +2476,9 @@ static int ME_CalculateClickCount(ME_TextEditor *editor, UINT msg, WPARAM wParam
static BOOL ME_SetCursor(ME_TextEditor *editor) { + ME_Cursor cursor; POINT pt; BOOL isExact; - int offset; SCROLLBARINFO sbi; DWORD messagePos = GetMessagePos(); pt.x = (short)LOWORD(messagePos); @@ -2533,13 +2533,11 @@ static BOOL ME_SetCursor(ME_TextEditor *editor) ITextHost_TxSetCursor(editor->texthost, hLeft, FALSE); return TRUE; } - offset = ME_CharFromPos(editor, pt.x, pt.y, &isExact); + ME_CharFromPos(editor, pt.x, pt.y, &cursor, &isExact); if (isExact) { - ME_Cursor cursor; ME_Run *run;
- ME_CursorFromCharOfs(editor, offset, &cursor); run = &cursor.pRun->member.run; if (run->style->fmt.dwMask & CFM_LINK && run->style->fmt.dwEffects & CFE_LINK) @@ -2553,6 +2551,7 @@ static BOOL ME_SetCursor(ME_TextEditor *editor) if (ME_IsSelection(editor)) { int selStart, selEnd; + int offset = ME_GetCursorOfs(&cursor);
ME_GetSelectionOfs(editor, &selStart, &selEnd); if (selStart <= offset && selEnd >= offset) { @@ -2926,20 +2925,17 @@ get_msg_name(UINT msg) static void ME_LinkNotify(ME_TextEditor *editor, UINT msg, WPARAM wParam, LPARAM lParam) { int x,y; - ME_DisplayItem *para, *run; BOOL isExact; - int nCharOfs; /* The start of the clicked text. Absolute character offset */ + ME_Cursor cursor; /* The start of the clicked text. */
ENLINK info; x = (short)LOWORD(lParam); y = (short)HIWORD(lParam); - nCharOfs = ME_CharFromPos(editor, x, y, &isExact); + ME_CharFromPos(editor, x, y, &cursor, &isExact); if (!isExact) return;
- ME_RunOfsFromCharOfs(editor, nCharOfs, ¶, &run, NULL); - - if ((run->member.run.style->fmt.dwMask & CFM_LINK) - && (run->member.run.style->fmt.dwEffects & CFE_LINK)) + if (cursor.pRun->member.run.style->fmt.dwMask & CFM_LINK && + cursor.pRun->member.run.style->fmt.dwEffects & CFE_LINK) { /* The clicked run has CFE_LINK set */ info.nmhdr.hwndFrom = editor->hWnd; info.nmhdr.idFrom = GetWindowLongW(editor->hWnd, GWLP_ID); @@ -2947,8 +2943,9 @@ static void ME_LinkNotify(ME_TextEditor *editor, UINT msg, WPARAM wParam, LPARAM info.msg = msg; info.wParam = wParam; info.lParam = lParam; - info.chrg.cpMin = ME_CharOfsFromRunOfs(editor, para, run, 0); - info.chrg.cpMax = info.chrg.cpMin + run->member.run.strText->nLen; + cursor.nOffset = 0; + info.chrg.cpMin = ME_GetCursorOfs(&cursor); + info.chrg.cpMax = info.chrg.cpMin + cursor.pRun->member.run.strText->nLen; SendMessageW(GetParent(editor->hWnd), WM_NOTIFY,info.nmhdr.idFrom, (LPARAM)&info); } } @@ -3824,7 +3821,14 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam, case EM_SETZOOM: return ME_SetZoom(editor, wParam, lParam); case EM_CHARFROMPOS: - return ME_CharFromPos(editor, ((POINTL *)lParam)->x, ((POINTL *)lParam)->y, NULL); + { + ME_Cursor cursor; + if (ME_CharFromPos(editor, ((POINTL *)lParam)->x, ((POINTL *)lParam)->y, + &cursor, NULL)) + return ME_GetCursorOfs(&cursor); + else + return -1; + } case EM_POSFROMCHAR: { ME_DisplayItem *pPara, *pRun; diff --git a/dlls/riched20/editor.h b/dlls/riched20/editor.h index 3dc00b8..1cffe99 100644 --- a/dlls/riched20/editor.h +++ b/dlls/riched20/editor.h @@ -162,7 +162,7 @@ int ME_SetSelection(ME_TextEditor *editor, int from, int to); void ME_HideCaret(ME_TextEditor *ed); void ME_ShowCaret(ME_TextEditor *ed); void ME_MoveCaret(ME_TextEditor *ed); -int ME_CharFromPos(ME_TextEditor *editor, int x, int y, BOOL *isExact); +BOOL ME_CharFromPos(ME_TextEditor *editor, int x, int y, ME_Cursor *cursor, BOOL *isExact); void ME_LButtonDown(ME_TextEditor *editor, int x, int y, int clickNum); void ME_MouseMove(ME_TextEditor *editor, int x, int y); BOOL ME_DeleteTextAtCursor(ME_TextEditor *editor, int nCursor, int nChars);