Huw Davies : riched20: Use cell ptrs in the table tab handler.
Alexandre Julliard
julliard at winehq.org
Thu Oct 29 16:32:08 CDT 2020
Module: wine
Branch: master
Commit: 963075706d6fcd23b9a0064ae46a210df9a4a005
URL: https://source.winehq.org/git/wine.git/?a=commit;h=963075706d6fcd23b9a0064ae46a210df9a4a005
Author: Huw Davies <huw at codeweavers.com>
Date: Thu Oct 29 10:49:13 2020 +0000
riched20: Use cell ptrs in the table tab handler.
Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/riched20/editor.c | 6 +--
dlls/riched20/editor.h | 2 +-
dlls/riched20/table.c | 104 +++++++++++++++++++++++--------------------------
3 files changed, 52 insertions(+), 60 deletions(-)
diff --git a/dlls/riched20/editor.c b/dlls/riched20/editor.c
index d06693232ab..7687ec9d93e 100644
--- a/dlls/riched20/editor.c
+++ b/dlls/riched20/editor.c
@@ -2799,7 +2799,7 @@ static LRESULT ME_Char(ME_TextEditor *editor, WPARAM charCode,
!(ctrl_is_down && !editor->bEmulateVersion10))
{
ME_DisplayItem *para;
- BOOL bSelectedRow = FALSE;
+ BOOL selected_row = FALSE;
para = cursor.pPara;
if (ME_IsSelection(editor) &&
@@ -2808,11 +2808,11 @@ static LRESULT ME_Char(ME_TextEditor *editor, WPARAM charCode,
para->member.para.prev_para->type == diParagraph)
{
para = para->member.para.prev_para;
- bSelectedRow = TRUE;
+ selected_row = TRUE;
}
if (ME_IsInTable(para))
{
- ME_TabPressedInTable(editor, bSelectedRow);
+ table_handle_tab( editor, selected_row );
ME_CommitUndo(editor);
return 0;
}
diff --git a/dlls/riched20/editor.h b/dlls/riched20/editor.h
index 6e1c639236e..a49883c9861 100644
--- a/dlls/riched20/editor.h
+++ b/dlls/riched20/editor.h
@@ -297,6 +297,7 @@ ME_Paragraph *cell_first_para( ME_Cell *cell ) DECLSPEC_HIDDEN;
ME_Cell *cell_next( ME_Cell *cell ) DECLSPEC_HIDDEN;
ME_Cell *cell_prev( ME_Cell *cell ) DECLSPEC_HIDDEN;
ME_Paragraph *table_append_row( ME_TextEditor *editor, ME_Paragraph *table_row ) DECLSPEC_HIDDEN;
+void table_handle_tab( ME_TextEditor *editor, BOOL selected_row ) DECLSPEC_HIDDEN;
ME_Paragraph *table_insert_cell( ME_TextEditor *editor, ME_Cursor *cursor ) DECLSPEC_HIDDEN;
ME_Paragraph *table_insert_row_end( ME_TextEditor *editor, ME_Cursor *cursor ) DECLSPEC_HIDDEN;
ME_Paragraph *table_insert_row_start( ME_TextEditor *editor, ME_Cursor *cursor ) DECLSPEC_HIDDEN;
@@ -308,7 +309,6 @@ ME_Cell *table_row_end_cell( ME_Paragraph *para ) DECLSPEC_HIDDEN;
ME_Cell *table_row_first_cell( ME_Paragraph *para ) DECLSPEC_HIDDEN;
ME_Paragraph *table_row_start( ME_Paragraph *para ) DECLSPEC_HIDDEN;
void ME_CheckTablesForCorruption(ME_TextEditor *editor) DECLSPEC_HIDDEN;
-void ME_TabPressedInTable(ME_TextEditor *editor, BOOL bSelectedRow) DECLSPEC_HIDDEN;
void ME_MoveCursorFromTableRowStartParagraph(ME_TextEditor *editor) DECLSPEC_HIDDEN;
struct RTFTable *ME_MakeTableDef(ME_TextEditor *editor) DECLSPEC_HIDDEN;
void ME_InitTableDef(ME_TextEditor *editor, struct RTFTable *tableDef) DECLSPEC_HIDDEN;
diff --git a/dlls/riched20/table.c b/dlls/riched20/table.c
index cc2ebb8ed50..25c4e1820ce 100644
--- a/dlls/riched20/table.c
+++ b/dlls/riched20/table.c
@@ -481,30 +481,27 @@ ME_Paragraph* table_append_row( ME_TextEditor *editor, ME_Paragraph *table_row )
}
/* Selects the next table cell or appends a new table row if at end of table */
-static void ME_SelectOrInsertNextCell( ME_TextEditor *editor, ME_DisplayItem *run )
+static void table_select_next_cell_or_append( ME_TextEditor *editor, ME_Run *run )
{
- ME_Paragraph *para = run->member.run.para;
+ ME_Paragraph *para = run->para;
+ ME_Cell *cell;
int i;
- assert(run && run->type == diRun);
- assert(ME_IsInTable(run));
+ assert( para_in_table( para ) );
if (!editor->bEmulateVersion10) /* v4.1 */
{
- ME_DisplayItem *cell;
/* Get the initial cell */
- if (para->nFlags & MEPF_ROWSTART) cell = para_next( para )->pCell;
- else if (para->nFlags & MEPF_ROWEND) cell = para_prev( para )->pCell;
- else cell = para->pCell;
- assert(cell);
+ if (para->nFlags & MEPF_ROWSTART) cell = para_cell( para_next( para ) );
+ else if (para->nFlags & MEPF_ROWEND) cell = para_cell( para_prev( para ) );
+ else cell = para_cell( para );
/* Get the next cell. */
- if (cell->member.cell.next_cell &&
- cell->member.cell.next_cell->member.cell.next_cell)
+ if (cell_next( cell ) && cell_next( cell_next( cell ) ))
+ cell = cell_next( cell );
+ else
{
- cell = cell->member.cell.next_cell;
- } else {
- para = para_next( table_row_end( &ME_FindItemFwd( cell, diParagraph )->member.para ) );
- if (para->nFlags & MEPF_ROWSTART) cell = para_next( para )->pCell;
+ para = para_next( table_row_end( para ) );
+ if (para->nFlags & MEPF_ROWSTART) cell = para_cell( para_next( para ) );
else
{
/* Insert row */
@@ -521,38 +518,32 @@ static void ME_SelectOrInsertNextCell( ME_TextEditor *editor, ME_DisplayItem *ru
}
}
/* Select cell */
- editor->pCursors[1].pRun = ME_FindItemFwd(cell, diRun);
- editor->pCursors[1].pPara = ME_GetParagraph(editor->pCursors[1].pRun);
+ editor->pCursors[1].pPara = para_get_di( cell_first_para( cell ) );
+ editor->pCursors[1].pRun = run_get_di( para_first_run( &editor->pCursors[1].pPara->member.para ) );
editor->pCursors[1].nOffset = 0;
- assert(editor->pCursors[0].pRun);
- cell = cell->member.cell.next_cell;
- editor->pCursors[0].pRun = ME_FindItemBack(cell, diRun);
- editor->pCursors[0].pPara = ME_GetParagraph(editor->pCursors[0].pRun);
+ editor->pCursors[0].pPara = para_get_di( cell_end_para( cell ) );
+ editor->pCursors[0].pRun = run_get_di( para_end_run( &editor->pCursors[0].pPara->member.para ) );
editor->pCursors[0].nOffset = 0;
- assert(editor->pCursors[1].pRun);
}
else /* v1.0 - 3.0 */
{
- if (run->member.run.nFlags & MERF_ENDPARA &&
- ME_IsInTable(ME_FindItemFwd(run, diParagraphOrEnd)))
+ if (run->nFlags & MERF_ENDPARA && para_in_table( para_next( para ) ))
{
- run = ME_FindItemFwd(run, diRun);
+ run = run_next_all_paras( run );
assert(run);
}
for (i = 0; i < 2; i++)
{
- while (!(run->member.run.nFlags & MERF_TAB))
+ while (!(run->nFlags & MERF_TAB))
{
- run = ME_FindItemFwd(run, diRunOrParagraphOrEnd);
- if (run->type != diRun)
+ if (!run_next( run ))
{
- para = &run->member.para;
+ para = para_next( run->para );
if (para_in_table( para ))
{
- run = run_get_di( para_first_run( para ) );
- assert(run);
+ run = para_first_run( para );
editor->pCursors[0].pPara = para_get_di( para );
- editor->pCursors[0].pRun = run;
+ editor->pCursors[0].pRun = run_get_di( run );
editor->pCursors[0].nOffset = 0;
i = 1;
}
@@ -569,18 +560,18 @@ static void ME_SelectOrInsertNextCell( ME_TextEditor *editor, ME_DisplayItem *ru
return;
}
}
+ else run = run_next( run );
}
- if (i == 0)
- run = ME_FindItemFwd(run, diRun);
- editor->pCursors[i].pRun = run;
- editor->pCursors[i].pPara = ME_GetParagraph(run);
+ if (i == 0) run = run_next_all_paras( run );
+ editor->pCursors[i].pRun = run_get_di( run );
+ editor->pCursors[i].pPara = para_get_di( run->para );
editor->pCursors[i].nOffset = 0;
}
}
}
-void ME_TabPressedInTable(ME_TextEditor *editor, BOOL bSelectedRow)
+void table_handle_tab( ME_TextEditor *editor, BOOL selected_row )
{
/* FIXME: Shift tab should move to the previous cell. */
ME_Cursor fromCursor, toCursor;
@@ -593,7 +584,9 @@ void ME_TabPressedInTable(ME_TextEditor *editor, BOOL bSelectedRow)
{
fromCursor = editor->pCursors[0];
toCursor = editor->pCursors[1];
- } else {
+ }
+ else
+ {
fromCursor = editor->pCursors[1];
toCursor = editor->pCursors[0];
}
@@ -604,29 +597,28 @@ void ME_TabPressedInTable(ME_TextEditor *editor, BOOL bSelectedRow)
{
editor->pCursors[0] = toCursor;
editor->pCursors[1] = toCursor;
- } else {
- ME_SelectOrInsertNextCell(editor, toCursor.pRun);
}
- } else { /* v1.0 - 3.0 */
- if (!ME_IsInTable(fromCursor.pRun)) {
+ else table_select_next_cell_or_append( editor, &toCursor.pRun->member.run );
+ }
+ else /* v1.0 - 3.0 */
+ {
+ if (!ME_IsInTable(fromCursor.pRun))
+ {
editor->pCursors[0] = fromCursor;
editor->pCursors[1] = fromCursor;
/* FIXME: For some reason the caret is shown at the start of the
* previous paragraph in v1.0 to v3.0 */
- } else if ((bSelectedRow || !ME_IsInTable(toCursor.pRun))) {
- ME_SelectOrInsertNextCell(editor, fromCursor.pRun);
- } else {
- if (ME_IsSelection(editor) && !toCursor.nOffset)
- {
- ME_DisplayItem *run;
- run = ME_FindItemBack(toCursor.pRun, diRunOrParagraphOrEnd);
- if (run->type == diRun && run->member.run.nFlags & MERF_TAB)
- ME_SelectOrInsertNextCell(editor, run);
- else
- ME_SelectOrInsertNextCell(editor, toCursor.pRun);
- } else {
- ME_SelectOrInsertNextCell(editor, toCursor.pRun);
- }
+ }
+ else if ((selected_row || !para_in_table( &toCursor.pPara->member.para )))
+ table_select_next_cell_or_append( editor, &fromCursor.pRun->member.run );
+ else
+ {
+ ME_Run *run = run_prev( &toCursor.pRun->member.run );
+
+ if (ME_IsSelection(editor) && !toCursor.nOffset && run && run->nFlags & MERF_TAB)
+ table_select_next_cell_or_append( editor, run );
+ else
+ table_select_next_cell_or_append( editor, &toCursor.pRun->member.run );
}
}
ME_InvalidateSelection(editor);
More information about the wine-cvs
mailing list