From e73890a72c004fcddf5d15e95b76f49d97ce57c7 Mon Sep 17 00:00:00 2001 From: Matt Finnicum Date: Wed, 16 Aug 2006 22:29:17 -0400 Subject: [PATCH] riched20: Send EN_LINK notifications. Properly underline / color links. --- 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(-) diff --git a/dlls/riched20/editor.c b/dlls/riched20/editor.c index 85f9a20c91d..048c8921706 100644 --- a/dlls/riched20/editor.c +++ b/dlls/riched20/editor.c @@ -2298,16 +2298,20 @@ LRESULT WINAPI RichEditANSIWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lP 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 *editor, int nCode) 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 *editor, WCHAR curChar) 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 4409069626f..c5be88af754 100644 --- a/dlls/riched20/editor.h +++ b/dlls/riched20/editor.h @@ -247,6 +247,7 @@ void ME_RegisterEditorClass(HINSTANCE hInstance); 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 2384dd803fe..53261cee0ff 100644 --- a/dlls/riched20/paint.c +++ b/dlls/riched20/paint.c @@ -138,7 +138,9 @@ static void ME_DrawTextWithStyle(ME_Context *c, int x, int y, LPCWSTR szText, in 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 6104a0c6257..14c8d803def 100644 --- a/dlls/riched20/style.c +++ b/dlls/riched20/style.c @@ -275,7 +275,7 @@ ME_LogFontFromStyle(HDC hDC, LOGFONTW *lf, ME_Style *s, int nZoomNumerator, int 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, LOGFONTW *lf, CHARFORMAT2W *fmt) 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; -- 2.11.4.GIT