From d47f66191e1497fd2776528aac29b9ddedf82108 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20Villac=C3=ADs=20Lasso?= Date: Sat, 26 Apr 2008 13:29:53 -0500 Subject: [PATCH] richedit: Add support for encoding number of CR and LF contained within a line break. --- dlls/riched20/caret.c | 10 +++++++++- dlls/riched20/editor.h | 2 +- dlls/riched20/editstr.h | 2 ++ dlls/riched20/list.c | 2 ++ dlls/riched20/para.c | 25 +++++++++++++++++-------- dlls/riched20/undo.c | 6 +++++- 6 files changed, 36 insertions(+), 11 deletions(-) diff --git a/dlls/riched20/caret.c b/dlls/riched20/caret.c index 7d50460cf07..21530924ff3 100644 --- a/dlls/riched20/caret.c +++ b/dlls/riched20/caret.c @@ -531,7 +531,15 @@ void ME_InsertTextFromCursor(ME_TextEditor *editor, int nCursor, } tmp_style = ME_GetInsertStyle(editor, nCursor); /* ME_SplitParagraph increases style refcount */ - tp = ME_SplitParagraph(editor, p->pRun, p->pRun->member.run.style); + + /* TODO: move here and fix logic for pos updating according to emulation, + so that number of CR and LF encoded are a result of such logic, instead + of hardcoded as below. + */ + if (editor->bEmulateVersion10) + tp = ME_SplitParagraph(editor, p->pRun, p->pRun->member.run.style, 1, 1); + else + tp = ME_SplitParagraph(editor, p->pRun, p->pRun->member.run.style, 1, 0); p->pRun = ME_FindItemFwd(tp, diRun); end_run = ME_FindItemBack(tp, diRun); ME_ReleaseStyle(end_run->member.run.style); diff --git a/dlls/riched20/editor.h b/dlls/riched20/editor.h index 0c0d324ab49..992ce7fd686 100644 --- a/dlls/riched20/editor.h +++ b/dlls/riched20/editor.h @@ -220,7 +220,7 @@ int ME_twips2pointsY(ME_Context *c, int y); ME_DisplayItem *ME_GetParagraph(ME_DisplayItem *run); void ME_GetSelectionParas(ME_TextEditor *editor, ME_DisplayItem **para, ME_DisplayItem **para_end); void ME_MakeFirstParagraph(ME_TextEditor *editor); -ME_DisplayItem *ME_SplitParagraph(ME_TextEditor *editor, ME_DisplayItem *rp, ME_Style *style); +ME_DisplayItem *ME_SplitParagraph(ME_TextEditor *editor, ME_DisplayItem *rp, ME_Style *style, int numCR, int numLF); ME_DisplayItem *ME_JoinParagraphs(ME_TextEditor *editor, ME_DisplayItem *tp); void ME_DumpParaStyle(ME_Paragraph *s); void ME_DumpParaStyleToBuf(const PARAFORMAT2 *pFmt, char buf[2048]); diff --git a/dlls/riched20/editstr.h b/dlls/riched20/editstr.h index 964f356dcf6..aedaefa7e99 100644 --- a/dlls/riched20/editstr.h +++ b/dlls/riched20/editstr.h @@ -148,6 +148,7 @@ typedef struct tagME_Run POINT pt; /* relative to para's position */ struct tagME_TableCell *pCell; /* for MERF_CELL: points to respective cell in ME_Paragraph */ REOBJECT *ole_obj; /* FIXME: should be a union with strText (at least) */ + int nCR; int nLF; /* for MERF_ENDPARA: number of \r and \n characters encoded by run */ } ME_Run; typedef struct tagME_Document { @@ -217,6 +218,7 @@ typedef struct tagME_UndoItem { ME_DisplayItem di; int nStart, nLen; + int nCR, nLF; /* used by diUndoSplitParagraph */ } ME_UndoItem; typedef struct tagME_TextBuffer diff --git a/dlls/riched20/list.c b/dlls/riched20/list.c index 14f9b178a40..951e7f36e2b 100644 --- a/dlls/riched20/list.c +++ b/dlls/riched20/list.c @@ -200,6 +200,8 @@ void ME_DumpDocument(ME_TextBuffer *buffer) case diRun: TRACE(" - Run(\"%s\", %d)\n", debugstr_w(pItem->member.run.strText->szData), pItem->member.run.nCharOfs); + if (pItem->member.run.nFlags & MERF_ENDPARA) + TRACE(" - Paragraph end: %d CR, %d LF\n", pItem->member.run.nCR, pItem->member.run.nLF); break; case diTextEnd: TRACE("End(ofs=%d)\n", pItem->member.para.nCharOfs); diff --git a/dlls/riched20/para.c b/dlls/riched20/para.c index b2f8e6c117b..6f5291080ea 100644 --- a/dlls/riched20/para.c +++ b/dlls/riched20/para.c @@ -110,7 +110,7 @@ void ME_MarkForPainting(ME_TextEditor *editor, ME_DisplayItem *first, const ME_D } /* split paragraph at the beginning of the run */ -ME_DisplayItem *ME_SplitParagraph(ME_TextEditor *editor, ME_DisplayItem *run, ME_Style *style) +ME_DisplayItem *ME_SplitParagraph(ME_TextEditor *editor, ME_DisplayItem *run, ME_Style *style, int numCR, int numLF) { ME_DisplayItem *next_para = NULL; ME_DisplayItem *run_para = NULL; @@ -119,10 +119,12 @@ ME_DisplayItem *ME_SplitParagraph(ME_TextEditor *editor, ME_DisplayItem *run, ME ME_UndoItem *undo = NULL; int ofs; ME_DisplayItem *pp; - int end_len = (editor->bEmulateVersion10 ? 2 : 1); + int end_len = numCR + numLF; assert(run->type == diRun); + end_run->member.run.nCR = numCR; + end_run->member.run.nLF = numLF; run_para = ME_GetParagraph(run); assert(run_para->member.para.pFmt->cbSize == sizeof(PARAFORMAT2)); @@ -204,7 +206,7 @@ ME_DisplayItem *ME_JoinParagraphs(ME_TextEditor *editor, ME_DisplayItem *tp) ME_DisplayItem *pNext, *pFirstRunInNext, *pRun, *pTmp; int i, shift; ME_UndoItem *undo = NULL; - int end_len = (editor->bEmulateVersion10 ? 2 : 1); + int end_len; assert(tp->type == diParagraph); assert(tp->member.para.next_para); @@ -212,6 +214,15 @@ ME_DisplayItem *ME_JoinParagraphs(ME_TextEditor *editor, ME_DisplayItem *tp) pNext = tp->member.para.next_para; + /* Need to locate end-of-paragraph run here, in order to know end_len */ + pRun = ME_FindItemBack(pNext, diRunOrParagraph); + + assert(pRun); + assert(pRun->type == diRun); + assert(pRun->member.run.nFlags & MERF_ENDPARA); + + end_len = pRun->member.run.nCR + pRun->member.run.nLF; + { /* null char format operation to store the original char format for the ENDPARA run */ CHARFORMAT2W fmt; @@ -222,18 +233,16 @@ ME_DisplayItem *ME_JoinParagraphs(ME_TextEditor *editor, ME_DisplayItem *tp) if (undo) { undo->nStart = pNext->member.para.nCharOfs - end_len; + undo->nCR = pRun->member.run.nCR; + undo->nLF = pRun->member.run.nLF; assert(pNext->member.para.pFmt->cbSize == sizeof(PARAFORMAT2)); *undo->di.member.para.pFmt = *pNext->member.para.pFmt; } shift = pNext->member.para.nCharOfs - tp->member.para.nCharOfs - end_len; - pRun = ME_FindItemBack(pNext, diRunOrParagraph); pFirstRunInNext = ME_FindItemFwd(pNext, diRunOrParagraph); - - assert(pRun); - assert(pRun->type == diRun); - assert(pRun->member.run.nFlags & MERF_ENDPARA); + assert(pFirstRunInNext->type == diRun); /* if some cursor points at end of paragraph, make it point to the first diff --git a/dlls/riched20/undo.c b/dlls/riched20/undo.c index 43f88103758..a26f0e07eb1 100644 --- a/dlls/riched20/undo.c +++ b/dlls/riched20/undo.c @@ -56,6 +56,7 @@ ME_UndoItem *ME_AddUndoItem(ME_TextEditor *editor, ME_DIType type, const ME_Disp else { ME_DisplayItem *pItem = (ME_DisplayItem *)ALLOC_OBJ(ME_UndoItem); + ((ME_UndoItem *)pItem)->nCR = ((ME_UndoItem *)pItem)->nLF = -1; switch(type) { case diUndoEndTransaction: @@ -225,7 +226,10 @@ static void ME_PlayUndoItem(ME_TextEditor *editor, ME_DisplayItem *pItem) ME_CursorFromCharOfs(editor, pUItem->nStart, &tmp); if (tmp.nOffset) tmp.pRun = ME_SplitRunSimple(editor, tmp.pRun, tmp.nOffset); - new_para = ME_SplitParagraph(editor, tmp.pRun, tmp.pRun->member.run.style); + assert(pUItem->nCR >= 0); + assert(pUItem->nLF >= 0); + new_para = ME_SplitParagraph(editor, tmp.pRun, tmp.pRun->member.run.style, + pUItem->nCR, pUItem->nLF); assert(pItem->member.para.pFmt->cbSize == sizeof(PARAFORMAT2)); *new_para->member.para.pFmt = *pItem->member.para.pFmt; break;