Eric Pouech : richedit: Extend the usage of underlinetype from charformat2 in richedit.

Alexandre Julliard julliard at winehq.org
Wed Jan 2 07:34:50 CST 2008


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

Author: Eric Pouech <eric.pouech at orange.fr>
Date:   Tue Jan  1 22:03:58 2008 +0100

richedit: Extend the usage of underlinetype from charformat2 in richedit.

---

 dlls/riched20/editor.c |   24 ++++++++++++++++++------
 dlls/riched20/para.c   |    4 ++--
 dlls/riched20/run.c    |    6 ++++--
 dlls/riched20/style.c  |   37 +++++++++++++++++++++++++++++++++++++
 4 files changed, 61 insertions(+), 10 deletions(-)

diff --git a/dlls/riched20/editor.c b/dlls/riched20/editor.c
index 12fa18c..1589173 100644
--- a/dlls/riched20/editor.c
+++ b/dlls/riched20/editor.c
@@ -332,10 +332,11 @@ static void ME_RTFCharAttrHook(RTF_Info *info)
   {
     case rtfPlain:
       /* FIXME add more flags once they're implemented */
-      fmt.dwMask = CFM_BOLD | CFM_ITALIC | CFM_UNDERLINE | CFM_STRIKEOUT | CFM_COLOR | CFM_BACKCOLOR | CFM_SIZE | CFM_WEIGHT;
+      fmt.dwMask = CFM_BOLD | CFM_ITALIC | CFM_UNDERLINETYPE | CFM_STRIKEOUT | CFM_COLOR | CFM_BACKCOLOR | CFM_SIZE | CFM_WEIGHT;
       fmt.dwEffects = CFE_AUTOCOLOR | CFE_AUTOBACKCOLOR;
       fmt.yHeight = 12*20; /* 12pt */
       fmt.wWeight = 400;
+      fmt.bUnderlineType = CFU_UNDERLINENONE;
       break;
     case rtfBold:
       fmt.dwMask = CFM_BOLD;
@@ -346,13 +347,24 @@ static void ME_RTFCharAttrHook(RTF_Info *info)
       fmt.dwEffects = info->rtfParam ? fmt.dwMask : 0;
       break;
     case rtfUnderline:
-      fmt.dwMask = CFM_UNDERLINE;
-      fmt.dwEffects = info->rtfParam ? fmt.dwMask : 0;
-      fmt.bUnderlineType = CFU_CF1UNDERLINE;
+      fmt.dwMask = CFM_UNDERLINETYPE;
+      fmt.bUnderlineType = info->rtfParam ? CFU_CF1UNDERLINE : CFU_UNDERLINENONE;
+      break;
+    case rtfDotUnderline:
+      fmt.dwMask = CFM_UNDERLINETYPE;
+      fmt.bUnderlineType = info->rtfParam ? CFU_UNDERLINEDOTTED : CFU_UNDERLINENONE;
+      break;
+    case rtfDbUnderline:
+      fmt.dwMask = CFM_UNDERLINETYPE;
+      fmt.bUnderlineType = info->rtfParam ? CFU_UNDERLINEDOUBLE : CFU_UNDERLINENONE;
+      break;
+    case rtfWordUnderline:
+      fmt.dwMask = CFM_UNDERLINETYPE;
+      fmt.bUnderlineType = info->rtfParam ? CFU_UNDERLINEWORD : CFU_UNDERLINENONE;
       break;
     case rtfNoUnderline:
-      fmt.dwMask = CFM_UNDERLINE;
-      fmt.dwEffects = 0;
+      fmt.dwMask = CFM_UNDERLINETYPE;
+      fmt.bUnderlineType = CFU_UNDERLINENONE;
       break;
     case rtfStrikeThru:
       fmt.dwMask = CFM_STRIKEOUT;
diff --git a/dlls/riched20/para.c b/dlls/riched20/para.c
index 8a373ec..5f93653 100644
--- a/dlls/riched20/para.c
+++ b/dlls/riched20/para.c
@@ -44,7 +44,7 @@ void ME_MakeFirstParagraph(HDC hDC, ME_TextBuffer *text)
   cf.dwMask |= CFM_ALLCAPS|CFM_BOLD|CFM_DISABLED|CFM_EMBOSS|CFM_HIDDEN;
   cf.dwMask |= CFM_IMPRINT|CFM_ITALIC|CFM_LINK|CFM_OUTLINE|CFM_PROTECTED;
   cf.dwMask |= CFM_REVISED|CFM_SHADOW|CFM_SMALLCAPS|CFM_STRIKEOUT;
-  cf.dwMask |= CFM_SUBSCRIPT|CFM_UNDERLINE|CFM_WEIGHT;
+  cf.dwMask |= CFM_SUBSCRIPT|CFM_UNDERLINETYPE|CFM_WEIGHT;
   
   cf.dwEffects = CFE_AUTOCOLOR | CFE_AUTOBACKCOLOR;
   lstrcpyW(cf.szFaceName, lf.lfFaceName);
@@ -53,7 +53,7 @@ void ME_MakeFirstParagraph(HDC hDC, ME_TextBuffer *text)
     cf.dwEffects |= CFE_BOLD;
   cf.wWeight = lf.lfWeight;
   if (lf.lfItalic) cf.dwEffects |= CFE_ITALIC;
-  if (lf.lfUnderline) cf.dwEffects |= CFE_UNDERLINE;
+  cf.bUnderlineType = (lf.lfUnderline) ? CFU_CF1UNDERLINE : CFU_UNDERLINENONE;
   if (lf.lfStrikeOut) cf.dwEffects |= CFE_STRIKEOUT;
   cf.bPitchAndFamily = lf.lfPitchAndFamily;
   cf.bCharSet = lf.lfCharSet;
diff --git a/dlls/riched20/run.c b/dlls/riched20/run.c
index 1630653..71354fe 100644
--- a/dlls/riched20/run.c
+++ b/dlls/riched20/run.c
@@ -938,8 +938,8 @@ void ME_GetCharFormat(ME_TextEditor *editor, int nFrom, int nTo, CHARFORMAT2W *p
 
   do {
     /* FIXME add more style feature comparisons */
-    int nAttribs = CFM_SIZE | CFM_FACE | CFM_COLOR;
-    int nEffects = CFM_BOLD | CFM_ITALIC | CFM_UNDERLINE;
+    int nAttribs = CFM_SIZE | CFM_FACE | CFM_COLOR | CFM_UNDERLINETYPE;
+    int nEffects = CFM_BOLD | CFM_ITALIC;
 
     run = ME_FindItemFwd(run, diRun);
 
@@ -962,6 +962,8 @@ void ME_GetCharFormat(ME_TextEditor *editor, int nFrom, int nTo, CHARFORMAT2W *p
     }
     if (pFmt->yHeight != tmp.yHeight)
       pFmt->dwMask &= ~CFM_SIZE;
+    if (pFmt->bUnderlineType != tmp.bUnderlineType)
+      pFmt->dwMask &= ~CFM_UNDERLINETYPE;
     if (pFmt->dwMask & CFM_COLOR)
     {
       if (!((pFmt->dwEffects&CFE_AUTOCOLOR) & (tmp.dwEffects&CFE_AUTOCOLOR)))
diff --git a/dlls/riched20/style.c b/dlls/riched20/style.c
index 1113f73..fbf8a30 100644
--- a/dlls/riched20/style.c
+++ b/dlls/riched20/style.c
@@ -85,6 +85,20 @@ CHARFORMAT2W *ME_ToCFAny(CHARFORMAT2W *to, CHARFORMAT2W *from)
     CHARFORMATA *t = (CHARFORMATA *)to;
     CopyMemory(t, from, FIELD_OFFSET(CHARFORMATA, szFaceName));
     WideCharToMultiByte(0, 0, from->szFaceName, -1, t->szFaceName, sizeof(t->szFaceName), 0, 0);
+    if (from->dwMask & CFM_UNDERLINETYPE)
+    {
+        switch (from->bUnderlineType)
+        {
+        case CFU_CF1UNDERLINE:
+            to->dwMask |= CFM_UNDERLINE;
+            to->dwEffects |= CFE_UNDERLINE;
+            break;
+        case CFU_UNDERLINENONE:
+            to->dwMask |= CFM_UNDERLINE;
+            to->dwEffects &= ~CFE_UNDERLINE;
+            break;
+        }
+    }
     t->cbSize = sizeof(*t); /* it was overwritten by CopyMemory */
     return to;
   }
@@ -92,6 +106,20 @@ CHARFORMAT2W *ME_ToCFAny(CHARFORMAT2W *to, CHARFORMAT2W *from)
   {
     CHARFORMATW *t = (CHARFORMATW *)to;
     CopyMemory(t, from, sizeof(*t));
+    if (from->dwMask & CFM_UNDERLINETYPE)
+    {
+        switch (from->bUnderlineType)
+        {
+        case CFU_CF1UNDERLINE:
+            to->dwMask |= CFM_UNDERLINE;
+            to->dwEffects |= CFE_UNDERLINE;
+            break;
+        case CFU_UNDERLINENONE:
+            to->dwMask |= CFM_UNDERLINE;
+            to->dwEffects &= ~CFE_UNDERLINE;
+            break;
+        }
+    }
     t->cbSize = sizeof(*t); /* it was overwritten by CopyMemory */
     return to;
   }
@@ -187,6 +215,13 @@ ME_Style *ME_ApplyStyle(ME_Style *sSrc, CHARFORMAT2W *style)
     else
       s->fmt.dwEffects &= ~CFE_AUTOCOLOR;
   }
+  if (style->dwMask & CFM_UNDERLINE)
+  {
+      s->fmt.dwMask |= CFM_UNDERLINETYPE;
+      s->fmt.dwMask &= ~CFM_UNDERLINE;
+      s->fmt.bUnderlineType = (style->dwEffects & CFM_UNDERLINE) ?
+          CFU_CF1UNDERLINE : CFU_UNDERLINENONE;
+  }
   return s;
 }
 
@@ -286,6 +321,8 @@ ME_LogFontFromStyle(HDC hDC, LOGFONTW *lf, const ME_Style *s, int nZoomNumerator
     lf->lfItalic = 1;
   if (s->fmt.dwEffects & s->fmt.dwMask & (CFM_UNDERLINE | CFE_LINK))
     lf->lfUnderline = 1;
+  if (s->fmt.dwMask & CFM_UNDERLINETYPE && s->fmt.bUnderlineType == CFU_CF1UNDERLINE)
+    lf->lfUnderline = 1;
   if (s->fmt.dwEffects & s->fmt.dwMask & CFM_STRIKEOUT)
     lf->lfStrikeOut = 1;
   if (s->fmt.dwEffects & s->fmt.dwMask & (CFM_SUBSCRIPT|CFM_SUPERSCRIPT))




More information about the wine-cvs mailing list