From 6b591ef23aadaf8981eb1a782b9f1e37024b5a66 Mon Sep 17 00:00:00 2001 From: Eric Pouech Date: Tue, 1 Jan 2008 22:03:58 +0100 Subject: [PATCH] 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 12fa18c88c4..158917331f5 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 8a373ec6408..5f9365325f8 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 16306530b0b..71354fe9680 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 1113f733886..fbf8a30c7ee 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))