Signed-off-by: Huw Davies huw@codeweavers.com --- dlls/riched20/editor.c | 12 ++++------- dlls/riched20/editor.h | 2 +- dlls/riched20/row.c | 47 +++++++++++++++++++----------------------- 3 files changed, 26 insertions(+), 35 deletions(-)
diff --git a/dlls/riched20/editor.c b/dlls/riched20/editor.c index 168dc51d827..41906d28e4c 100644 --- a/dlls/riched20/editor.c +++ b/dlls/riched20/editor.c @@ -4312,17 +4312,13 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam, } case EM_LINEFROMCHAR: { - if (wParam == -1) - return ME_RowNumberFromCharOfs(editor, ME_GetCursorOfs(&editor->pCursors[1])); - else - return ME_RowNumberFromCharOfs(editor, wParam); + if (wParam == -1) wParam = ME_GetCursorOfs( editor->pCursors + 1 ); + return row_number_from_char_ofs( editor, wParam ); } case EM_EXLINEFROMCHAR: { - if (lParam == -1) - return ME_RowNumberFromCharOfs(editor, ME_GetCursorOfs(&editor->pCursors[1])); - else - return ME_RowNumberFromCharOfs(editor, lParam); + if (lParam == -1) lParam = ME_GetCursorOfs( editor->pCursors + 1 ); + return row_number_from_char_ofs( editor, lParam ); } case EM_LINEINDEX: { diff --git a/dlls/riched20/editor.h b/dlls/riched20/editor.h index e5d580846d0..e884cbee2f3 100644 --- a/dlls/riched20/editor.h +++ b/dlls/riched20/editor.h @@ -118,7 +118,7 @@ ME_Row *row_from_cursor( ME_Cursor *cursor ) DECLSPEC_HIDDEN; ME_Row *row_from_row_number( ME_TextEditor *editor, int row_num ) DECLSPEC_HIDDEN; ME_Row *row_next( ME_Row *row ) DECLSPEC_HIDDEN; ME_Run *row_next_run( ME_Row *row, ME_Run *run ) DECLSPEC_HIDDEN; -int ME_RowNumberFromCharOfs(ME_TextEditor *editor, int nOfs) DECLSPEC_HIDDEN; +int row_number_from_char_ofs( ME_TextEditor *editor, int ofs ) DECLSPEC_HIDDEN; static inline ME_DisplayItem *row_get_di( ME_Row *row ) { return (ME_DisplayItem *)((ptrdiff_t)row - offsetof(ME_DisplayItem, member)); diff --git a/dlls/riched20/row.c b/dlls/riched20/row.c index a12a8c7449b..9a87cf27fb5 100644 --- a/dlls/riched20/row.c +++ b/dlls/riched20/row.c @@ -102,33 +102,28 @@ ME_Row *row_from_row_number( ME_TextEditor *editor, int row_num ) }
-int -ME_RowNumberFromCharOfs(ME_TextEditor *editor, int nOfs) +int row_number_from_char_ofs( ME_TextEditor *editor, int ofs ) { - ME_DisplayItem *item = ME_FindItemFwd(editor->pBuffer->pFirst, diParagraph); - int nRow = 0; - - while (item->type == diParagraph && - item->member.para.next_para->member.para.nCharOfs <= nOfs) - { - nRow += item->member.para.nRows; - item = item->member.para.next_para; - } - if (item->type == diParagraph) - { - ME_DisplayItem *next_para = item->member.para.next_para; - - nOfs -= item->member.para.nCharOfs; - item = ME_FindItemFwd(item, diRun); - while ((item = ME_FindItemFwd(item, diStartRowOrParagraph)) != NULL) + ME_Paragraph *para = editor_first_para( editor ); + ME_Row *row; + ME_Cursor cursor; + int row_num = 0; + + while (para_next( para ) && para_next( para )->nCharOfs <= ofs) + { + row_num += para->nRows; + para = para_next( para ); + } + + if (para_next( para )) { - if (item == next_para) - break; - item = ME_FindItemFwd(item, diRun); - if (item->member.run.nCharOfs > nOfs) - break; - nRow++; + for (row = para_first_row( para ); row; row = row_next( row )) + { + row_end_cursor( row, &cursor, TRUE ); + if (ME_GetCursorOfs( &cursor ) > ofs ) break; + row_num++; + } } - } - return nRow; + + return row_num; }