[PATCH 3/5] riched20: Use row and para helpers for the selection function.

Huw Davies huw at codeweavers.com
Mon Oct 26 03:46:40 CDT 2020


Signed-off-by: Huw Davies <huw at codeweavers.com>
---
 dlls/riched20/caret.c  | 38 ++++++++++++++------------------------
 dlls/riched20/editor.h |  3 +++
 dlls/riched20/row.c    | 29 +++++++++++++++++++++++++++++
 3 files changed, 46 insertions(+), 24 deletions(-)

diff --git a/dlls/riched20/caret.c b/dlls/riched20/caret.c
index 5af4cd04d55..650c065dbe0 100644
--- a/dlls/riched20/caret.c
+++ b/dlls/riched20/caret.c
@@ -818,38 +818,28 @@ ME_SelectByType(ME_TextEditor *editor, ME_SelectionType selectionType)
       editor->pCursors[1] = editor->pCursors[0];
       ME_MoveCursorWords(editor, &editor->pCursors[1], -1);
       break;
-    case stLine:
     case stParagraph:
-    {
-      ME_DisplayItem *pItem;
-      ME_DIType fwdSearchType, backSearchType;
-      if (selectionType == stParagraph) {
-          backSearchType = diParagraph;
-          fwdSearchType = diParagraphOrEnd;
-      } else {
-          backSearchType = diStartRow;
-          fwdSearchType = diStartRowOrParagraphOrEnd;
-      }
-      pItem = ME_FindItemFwd(editor->pCursors[0].pRun, fwdSearchType);
-      assert(pItem);
-      if (pItem->type == diTextEnd)
-          editor->pCursors[0].pRun = ME_FindItemBack(pItem, diRun);
-      else
-          editor->pCursors[0].pRun = ME_FindItemFwd(pItem, diRun);
-      editor->pCursors[0].pPara = ME_GetParagraph(editor->pCursors[0].pRun);
-      editor->pCursors[0].nOffset = 0;
+      editor->pCursors[1] = editor->pCursors[0];
 
-      pItem = ME_FindItemBack(pItem, backSearchType);
-      editor->pCursors[1].pRun = ME_FindItemFwd(pItem, diRun);
-      editor->pCursors[1].pPara = ME_GetParagraph(editor->pCursors[1].pRun);
+      editor->pCursors[0].pRun = run_get_di( para_end_run( &editor->pCursors[0].pPara->member.para ) );
+      editor->pCursors[0].pPara = para_get_di( editor->pCursors[0].pRun->member.run.para );
+      editor->pCursors[0].nOffset = editor->pCursors[0].pRun->member.run.len;
+
+      editor->pCursors[1].pRun = run_get_di( para_first_run( &editor->pCursors[1].pPara->member.para ) );
       editor->pCursors[1].nOffset = 0;
       break;
+    case stLine:
+    {
+      ME_Row *row = row_from_cursor( editor->pCursors );
+
+      row_first_cursor( row, editor->pCursors + 1 );
+      row_end_cursor( row, editor->pCursors, TRUE );
+      break;
     }
     case stDocument:
       /* Select everything with cursor anchored from the start of the text */
-      editor->nSelectionType = stDocument;
       ME_SetCursorToStart(editor, &editor->pCursors[1]);
-      ME_SetCursorToEnd(editor, &editor->pCursors[0], FALSE);
+      ME_SetCursorToEnd(editor, &editor->pCursors[0], TRUE);
       break;
     default: assert(0);
   }
diff --git a/dlls/riched20/editor.h b/dlls/riched20/editor.h
index 7025ddceea7..e197e3e9a9b 100644
--- a/dlls/riched20/editor.h
+++ b/dlls/riched20/editor.h
@@ -111,7 +111,10 @@ int ME_ReverseFindNonWhitespaceV(const ME_String *s, int nVChar) DECLSPEC_HIDDEN
 int ME_ReverseFindWhitespaceV(const ME_String *s, int nVChar) DECLSPEC_HIDDEN;
 
 /* row.c */
+void row_end_cursor( ME_Row *row, ME_Cursor *cursor, BOOL include_eop ) DECLSPEC_HIDDEN;
+void row_first_cursor( ME_Row *row, ME_Cursor *cursor ) DECLSPEC_HIDDEN;
 ME_Run *row_first_run( ME_Row *row ) DECLSPEC_HIDDEN;
+ME_Row *row_from_cursor( ME_Cursor *cursor ) DECLSPEC_HIDDEN;
 ME_Row *row_next( ME_Row *row ) DECLSPEC_HIDDEN;
 ME_Run *row_next_run( ME_Row *row, ME_Run *run ) DECLSPEC_HIDDEN;
 ME_DisplayItem *ME_RowStart(ME_DisplayItem *item) DECLSPEC_HIDDEN;
diff --git a/dlls/riched20/row.c b/dlls/riched20/row.c
index ce8de935a19..ba082244cfc 100644
--- a/dlls/riched20/row.c
+++ b/dlls/riched20/row.c
@@ -53,6 +53,35 @@ ME_Run *row_next_run( ME_Row *row, ME_Run *run )
     return &item->member.run;
 }
 
+ME_Row *row_from_cursor( ME_Cursor *cursor )
+{
+    ME_DisplayItem *item;
+
+    item = ME_FindItemBack( cursor->pRun, diStartRow );
+    return &item->member.row;
+}
+
+void row_first_cursor( ME_Row *row, ME_Cursor *cursor )
+{
+    ME_DisplayItem *item;
+
+    item = ME_FindItemFwd( row_get_di( row ), diRun );
+    cursor->pRun = item;
+    cursor->pPara = para_get_di( cursor->pRun->member.run.para );
+    cursor->nOffset = 0;
+}
+
+void row_end_cursor( ME_Row *row, ME_Cursor *cursor, BOOL include_eop )
+{
+    ME_DisplayItem *item, *run;
+
+    item = ME_FindItemFwd( row_get_di( row ), diStartRowOrParagraphOrEnd );
+    run = ME_FindItemBack( item, diRun );
+    cursor->pRun = run;
+    cursor->pPara = para_get_di( cursor->pRun->member.run.para );
+    cursor->nOffset = (item->type == diStartRow || include_eop) ? cursor->pRun->member.run.len : 0;
+}
+
 /* I'm sure these functions would simplify some code in caret ops etc,
  * I just didn't remember them when I wrote that code
  */ 
-- 
2.23.0




More information about the wine-devel mailing list