riched20: Send EN_LINK notifications. Properly underline / color
links.
Matt Finnicum
mattfinn at gmail.com
Wed Aug 16 21:29:17 CDT 2006
Hi,
This fixes bug 4547, and 5562 (though it was marked duplicate, there
was a second issue where links weren't underlined / colored properly).
--Matt Finnicum
---
dlls/riched20/editor.c | 40 +++++++++++++++++++++++++++++++++++++---
dlls/riched20/editor.h | 1 +
dlls/riched20/paint.c | 4 +++-
dlls/riched20/style.c | 4 +++-
4 files changed, 44 insertions(+), 5 deletions(-)
-------------- next part --------------
From 5cb9a5b72c8c6618860eb9c54c23b65957edb913 Mon Sep 17 00:00:00 2001
From: Matthew Finnicum <MattFinn at gmail.com>
Date: Wed, 16 Aug 2006 22:24:35 -0400
Subject: [PATCH] riched20: Send EN_LINK notifications. Properly underline / color links.
diff --git a/dlls/riched20/editor.c b/dlls/riched20/editor.c
index bf406bf..aa2fb5d 100644
--- a/dlls/riched20/editor.c
+++ b/dlls/riched20/editor.c
@@ -2298,16 +2298,20 @@ LRESULT WINAPI RichEditANSIWndProc(HWND
SetFocus(hWnd);
ME_LButtonDown(editor, (short)LOWORD(lParam), (short)HIWORD(lParam));
SetCapture(hWnd);
+ ME_LinkNotify(editor,msg,wParam,lParam);
break;
case WM_MOUSEMOVE:
if (GetCapture() == hWnd)
ME_MouseMove(editor, (short)LOWORD(lParam), (short)HIWORD(lParam));
break;
+ ME_LinkNotify(editor,msg,wParam,lParam);
case WM_LBUTTONUP:
if (GetCapture() == hWnd)
ReleaseCapture();
+ ME_LinkNotify(editor,msg,wParam,lParam);
break;
case WM_LBUTTONDBLCLK:
+ ME_LinkNotify(editor,msg,wParam,lParam);
ME_SelectWord(editor);
break;
case WM_CONTEXTMENU:
@@ -2612,6 +2616,37 @@ void ME_SendOldNotify(ME_TextEditor *edi
SendMessageA(GetParent(hWnd), WM_COMMAND, (nCode<<16)|GetWindowLongW(hWnd, GWLP_ID), (LPARAM)hWnd);
}
+void ME_LinkNotify(ME_TextEditor *editor, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ int x,y;
+ ME_Cursor tmpCursor;
+ ME_Run *tmpRun;
+ BOOL bNothing;
+ ENLINK info;
+ x = (short)LOWORD(lParam);
+ y = (short)HIWORD(lParam);
+ ME_FindPixelPos(editor, x, y, &tmpCursor, &bNothing);
+ tmpRun = &tmpCursor.pRun->member.run;
+ if (tmpRun->style->fmt.dwMask & CFM_UNDERLINE)
+ FIXME("CFM_UNDERLINE! GASP!\n");
+ if (tmpRun->style->fmt.dwEffects & CFE_UNDERLINE)
+ FIXME("CFE_UNDERLINE! GASP!\n");
+
+ if ((tmpRun->style->fmt.dwMask & CFM_LINK)
+ && (tmpRun->style->fmt.dwEffects & CFE_LINK))
+ { /* The clicked run has CFE_LINK set */
+ info.nmhdr.hwndFrom = editor->hWnd;
+ info.nmhdr.idFrom = GetWindowLongW(editor->hWnd, GWLP_ID);
+ info.nmhdr.code = EN_LINK;
+ info.msg = msg;
+ info.wParam = wParam;
+ info.lParam = lParam;
+ info.chrg.cpMin = ME_CharOfsFromRunOfs(editor,tmpCursor.pRun,0);
+ info.chrg.cpMax = info.chrg.cpMin + ME_StrVLen(tmpRun->strText);
+ SendMessageW(GetParent(editor->hWnd), WM_NOTIFY,info.nmhdr.idFrom, (LPARAM)&info);
+ }
+}
+
int ME_CountParagraphsBetween(ME_TextEditor *editor, int from, int to)
{
ME_DisplayItem *item = ME_FindItemFwd(editor->pBuffer->pFirst, diParagraph);
@@ -2840,9 +2875,8 @@ int ME_AutoURLDetect(ME_TextEditor *edit
RichEditANSIWndProc(editor->hWnd, EM_GETCHARFORMAT, SCF_SELECTION, (LPARAM) &cur_format);
RichEditANSIWndProc(editor->hWnd, EM_GETCHARFORMAT, SCF_DEFAULT, (LPARAM) &default_format);
link.cbSize = sizeof(link);
- link.dwMask = CFM_LINK | CFM_COLOR | CFM_UNDERLINE;
- link.dwEffects = CFE_LINK | CFE_UNDERLINE;
- link.crTextColor = RGB(0,0,255);
+ link.dwMask = CFM_LINK;
+ link.dwEffects = CFE_LINK;
curf_ef = cur_format.dwEffects & link.dwEffects;
def_ef = default_format.dwEffects & link.dwEffects;
link_ef = link.dwEffects & link.dwEffects;
diff --git a/dlls/riched20/editor.h b/dlls/riched20/editor.h
index 4409069..c5be88a 100644
--- a/dlls/riched20/editor.h
+++ b/dlls/riched20/editor.h
@@ -247,6 +247,7 @@ void ME_RegisterEditorClass(HINSTANCE hI
ME_TextEditor *ME_MakeEditor(HWND hWnd);
void ME_DestroyEditor(ME_TextEditor *editor);
void ME_SendOldNotify(ME_TextEditor *editor, int nCode);
+void ME_LinkNotify(ME_TextEditor *editor, UINT msg, WPARAM wParam, LPARAM lParam);
ME_UndoItem *ME_AddUndoItem(ME_TextEditor *editor, ME_DIType type, ME_DisplayItem *di);
void ME_CommitUndo(ME_TextEditor *editor);
void ME_Undo(ME_TextEditor *editor);
diff --git a/dlls/riched20/paint.c b/dlls/riched20/paint.c
index 2384dd8..53261ce 100644
--- a/dlls/riched20/paint.c
+++ b/dlls/riched20/paint.c
@@ -138,7 +138,9 @@ static void ME_DrawTextWithStyle(ME_Cont
int yOffset = 0, yTwipsOffset = 0;
hOldFont = ME_SelectStyleFont(c->editor, hDC, s);
rgbBack = ME_GetBackColor(c->editor);
- if ((s->fmt.dwMask & CFM_COLOR) && (s->fmt.dwEffects & CFE_AUTOCOLOR))
+ if ((s->fmt.dwMask & CFM_LINK) && (s->fmt.dwEffects & CFE_LINK))
+ rgbOld = SetTextColor(hDC, RGB(0,0,255));
+ else if ((s->fmt.dwMask & CFM_COLOR) && (s->fmt.dwEffects & CFE_AUTOCOLOR))
rgbOld = SetTextColor(hDC, GetSysColor(COLOR_WINDOWTEXT));
else
rgbOld = SetTextColor(hDC, s->fmt.crTextColor);
diff --git a/dlls/riched20/style.c b/dlls/riched20/style.c
index 6104a0c..14c8d80 100644
--- a/dlls/riched20/style.c
+++ b/dlls/riched20/style.c
@@ -275,7 +275,7 @@ ME_LogFontFromStyle(HDC hDC, LOGFONTW *l
lf->lfWeight = s->fmt.wWeight;
if (s->fmt.dwEffects & s->fmt.dwMask & CFM_ITALIC)
lf->lfItalic = 1;
- if (s->fmt.dwEffects & s->fmt.dwMask & CFM_UNDERLINE)
+ if (s->fmt.dwEffects & s->fmt.dwMask & (CFM_UNDERLINE | CFE_LINK))
lf->lfUnderline = 1;
if (s->fmt.dwEffects & s->fmt.dwMask & CFM_STRIKEOUT)
lf->lfStrikeOut = 1;
@@ -301,6 +301,8 @@ void ME_CharFormatFromLogFont(HDC hDC, L
if (lf->lfWeight>400) fmt->dwEffects |= CFM_BOLD;
if (lf->lfItalic) fmt->dwEffects |= CFM_ITALIC;
if (lf->lfUnderline) fmt->dwEffects |= CFM_UNDERLINE;
+ /* notice that if a logfont was created with underline due to CFM_LINK, this
+ would add an erronious CFM_UNDERLINE. This isn't currently ever a problem */
if (lf->lfStrikeOut) fmt->dwEffects |= CFM_STRIKEOUT;
fmt->bPitchAndFamily = lf->lfPitchAndFamily;
fmt->bCharSet = lf->lfCharSet;
--
1.4.1.1
More information about the wine-patches
mailing list