Dylan Smith : richedit: Added support for changing cell border colours.

Alexandre Julliard julliard at winehq.org
Mon Aug 18 10:47:09 CDT 2008


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

Author: Dylan Smith <dylan.ah.smith at gmail.com>
Date:   Tue Aug 12 23:15:40 2008 -0400

richedit: Added support for changing cell border colours.

---

 dlls/riched20/editor.c  |   67 ++++++++++++++++++++++++++++++++++++++++++----
 dlls/riched20/editstr.h |    2 +
 dlls/riched20/paint.c   |   14 ++++++---
 dlls/riched20/para.c    |    1 +
 dlls/riched20/rtf.h     |    1 +
 5 files changed, 74 insertions(+), 11 deletions(-)

diff --git a/dlls/riched20/editor.c b/dlls/riched20/editor.c
index 9fc11a5..aa59383 100644
--- a/dlls/riched20/editor.c
+++ b/dlls/riched20/editor.c
@@ -320,6 +320,32 @@ static LRESULT ME_StreamInText(ME_TextEditor *editor, DWORD dwFormat, ME_InStrea
   return 0;
 }
 
+static void ME_ApplyBorderProperties(RTF_Info *info,
+                                     ME_BorderRect *borderRect,
+                                     RTFBorder *borderDef)
+{
+  int i, colorNum;
+  ME_Border *pBorders[] = {&borderRect->top,
+                           &borderRect->left,
+                           &borderRect->bottom,
+                           &borderRect->right};
+  for (i = 0; i < 4; i++)
+  {
+    RTFColor *colorDef = info->colorList;
+    pBorders[i]->width = borderDef[i].width;
+    colorNum = borderDef[i].color;
+    while (colorDef && colorDef->rtfCNum != colorNum)
+      colorDef = colorDef->rtfNextColor;
+    if (colorDef)
+      pBorders[i]->colorRef = RGB(
+                           colorDef->rtfCRed >= 0 ? colorDef->rtfCRed : 0,
+                           colorDef->rtfCGreen >= 0 ? colorDef->rtfCGreen : 0,
+                           colorDef->rtfCBlue >= 0 ? colorDef->rtfCBlue : 0);
+    else
+      pBorders[i]->colorRef = RGB(0, 0, 0);
+  }
+}
+
 static void ME_RTFCharAttrHook(RTF_Info *info)
 {
   CHARFORMAT2W fmt;
@@ -767,7 +793,31 @@ static void ME_RTFParAttrHook(RTF_Info *info)
     fmt.wBorderSpace = info->rtfParam;
     fmt.dwMask = PFM_BORDER;
     break;
-  }  
+  case rtfBorderColor:
+  {
+    RTFTable *tableDef = info->tableDef;
+    int borderSide = info->borderType & RTFBorderSideMask;
+    int borderType = info->borderType & RTFBorderTypeMask;
+    switch(borderType)
+    {
+    case RTFBorderTypePara:
+      if (!info->editor->bEmulateVersion10) /* v4.1 */
+        break;
+      /* v1.0 - 3.0 treat paragraph and row borders the same. */
+    case RTFBorderTypeRow:
+      if (tableDef) {
+        tableDef->border[borderSide].color = info->rtfParam;
+      }
+      break;
+    case RTFBorderTypeCell:
+      if (tableDef && tableDef->numCellsDefined < MAX_TABLE_CELLS) {
+        tableDef->cells[tableDef->numCellsDefined].border[borderSide].color = info->rtfParam;
+      }
+      break;
+    }
+    break;
+  }
+  }
   if (fmt.dwMask) {
     RTFFlushOutputBuffer(info);
     /* FIXME too slow ? how come ?*/
@@ -930,11 +980,10 @@ static void ME_RTFSpecialCharHook(RTF_Info *info)
         } else {
           for (i = 0; i < tableDef->numCellsDefined; i++)
           {
-            cell->member.cell.nRightBoundary = tableDef->cells[i].rightBoundary;
-            cell->member.cell.border.top.width = tableDef->cells[i].border[0].width;
-            cell->member.cell.border.left.width = tableDef->cells[i].border[1].width;
-            cell->member.cell.border.bottom.width = tableDef->cells[i].border[2].width;
-            cell->member.cell.border.right.width = tableDef->cells[i].border[3].width;
+            RTFCell *cellDef = &tableDef->cells[i];
+            cell->member.cell.nRightBoundary = cellDef->rightBoundary;
+            ME_ApplyBorderProperties(info, &cell->member.cell.border,
+                                     cellDef->border);
             cell = cell->member.cell.next_cell;
             if (!cell)
             {
@@ -962,6 +1011,8 @@ static void ME_RTFSpecialCharHook(RTF_Info *info)
         para = ME_InsertTableRowEndFromCursor(info->editor);
         para->member.para.pFmt->dxOffset = abs(info->tableDef->gapH);
         para->member.para.pFmt->dxStartIndent = info->tableDef->leftEdge;
+        ME_ApplyBorderProperties(info, &para->member.para.border,
+                                 tableDef->border);
         info->nestingLevel--;
         if (!info->nestingLevel)
         {
@@ -984,6 +1035,10 @@ static void ME_RTFSpecialCharHook(RTF_Info *info)
         PARAFORMAT2 *pFmt = para->member.para.pFmt;
         pFmt->dxOffset = info->tableDef->gapH;
         pFmt->dxStartIndent = info->tableDef->leftEdge;
+
+        para = ME_GetParagraph(info->editor->pCursors[0].pRun);
+        ME_ApplyBorderProperties(info, &para->member.para.border,
+                                 tableDef->border);
         while (tableDef->numCellsInserted < tableDef->numCellsDefined)
         {
           WCHAR tab = '\t';
diff --git a/dlls/riched20/editstr.h b/dlls/riched20/editstr.h
index 3c4a083..edbeb13 100644
--- a/dlls/riched20/editstr.h
+++ b/dlls/riched20/editstr.h
@@ -168,6 +168,7 @@ typedef struct tagME_Document {
 typedef struct tagME_Border
 {
   int width;
+  COLORREF colorRef;
 } ME_Border;
 
 typedef struct tagME_BorderRect
@@ -183,6 +184,7 @@ typedef struct tagME_Paragraph
   PARAFORMAT2 *pFmt;
 
   struct tagME_DisplayItem *pCell; /* v4.1 */
+  ME_BorderRect border;
 
   int nCharOfs;
   int nFlags;
diff --git a/dlls/riched20/paint.c b/dlls/riched20/paint.c
index 0bafd1a..9cfc21e 100644
--- a/dlls/riched20/paint.c
+++ b/dlls/riched20/paint.c
@@ -755,7 +755,7 @@ static void ME_DrawTableBorders(ME_Context *c, ME_DisplayItem *paragraph)
         rc.bottom = bottom;
         if (cell->border.left.width > 0)
         {
-          color = RGB(0,0,0);
+          color = cell->border.left.colorRef;
           width = max(ME_twips2pointsX(c, cell->border.left.width), 1);
         } else {
           color = RGB(192,192,192);
@@ -777,7 +777,7 @@ static void ME_DrawTableBorders(ME_Context *c, ME_DisplayItem *paragraph)
       if (atTop) {
         if (cell->border.top.width > 0)
         {
-          brush = GetStockObject(BLACK_BRUSH);
+          brush = CreateSolidBrush(cell->border.top.colorRef);
           width = max(ME_twips2pointsY(c, cell->border.top.width), 1);
         } else {
           brush = GetStockObject(LTGRAY_BRUSH);
@@ -786,6 +786,8 @@ static void ME_DrawTableBorders(ME_Context *c, ME_DisplayItem *paragraph)
         rc.top = top;
         rc.bottom = rc.top + width;
         FillRect(c->hDC, &rc, brush);
+        if (cell->border.top.width > 0)
+          DeleteObject(brush);
       }
 
       /* Draw the bottom border if at the last paragraph in the cell, and when
@@ -809,13 +811,15 @@ static void ME_DrawTableBorders(ME_Context *c, ME_DisplayItem *paragraph)
         }
         if (rc.left < rc.right) {
           if (cell->border.bottom.width > 0) {
-            brush = GetStockObject(BLACK_BRUSH);
+            brush = CreateSolidBrush(cell->border.bottom.colorRef);
           } else {
             brush = GetStockObject(LTGRAY_BRUSH);
           }
           rc.bottom = bottom;
           rc.top = rc.bottom - width;
           FillRect(c->hDC, &rc, brush);
+          if (cell->border.bottom.width > 0)
+            DeleteObject(brush);
         }
         rc.left = oldLeft;
       }
@@ -827,7 +831,7 @@ static void ME_DrawTableBorders(ME_Context *c, ME_DisplayItem *paragraph)
         rc.top = top;
         rc.bottom = bottom;
         if (cell->border.right.width > 0) {
-          color = RGB(0,0,0);
+          color = cell->border.right.colorRef;
           width = max(ME_twips2pointsX(c, cell->border.right.width), 1);
         } else {
           color = RGB(192,192,192);
@@ -854,7 +858,7 @@ static void ME_DrawTableBorders(ME_Context *c, ME_DisplayItem *paragraph)
       POINT oldPt;
       PARAFORMAT2 *pNextFmt;
 
-      pen = CreatePen(PS_SOLID, 0, RGB(0,0,0));
+      pen = CreatePen(PS_SOLID, 0, para->border.top.colorRef);
       oldpen = SelectObject(c->hDC, pen);
 
       /* Find the start relative to the text */
diff --git a/dlls/riched20/para.c b/dlls/riched20/para.c
index b8676d1..dd745ff 100644
--- a/dlls/riched20/para.c
+++ b/dlls/riched20/para.c
@@ -177,6 +177,7 @@ ME_DisplayItem *ME_SplitParagraph(ME_TextEditor *editor, ME_DisplayItem *run,
 
   /* FIXME initialize format style and call ME_SetParaFormat blah blah */
   *new_para->member.para.pFmt = *run_para->member.para.pFmt;
+  new_para->member.para.border = run_para->member.para.border;
 
   /* insert paragraph into paragraph double linked list */
   new_para->member.para.prev_para = run_para;
diff --git a/dlls/riched20/rtf.h b/dlls/riched20/rtf.h
index 5cf699b..ec08161 100644
--- a/dlls/riched20/rtf.h
+++ b/dlls/riched20/rtf.h
@@ -1010,6 +1010,7 @@ struct RTFStyleElt
 struct RTFBorder
 {
 	int width;
+	int color;
 };
 
 struct RTFCell




More information about the wine-cvs mailing list