Alex Villacís Lasso : richedit: Add support for encoding number of CR and LF contained within a line break .

Alexandre Julliard julliard at winehq.org
Tue Apr 29 08:54:43 CDT 2008


Module: wine
Branch: master
Commit: d47f66191e1497fd2776528aac29b9ddedf82108
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=d47f66191e1497fd2776528aac29b9ddedf82108

Author: Alex Villacís Lasso <a_villacis at palosanto.com>
Date:   Sat Apr 26 13:29:53 2008 -0500

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 7d50460..2153092 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 0c0d324..992ce7f 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 964f356..aedaefa 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 14f9b17..951e7f3 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 b2f8e6c..6f52910 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 43f8810..a26f0e0 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;




More information about the wine-cvs mailing list