Matt Finnicum : riched20: Send EN_LINK notifications. Properly underline / color links.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Aug 17 05:04:41 CDT 2006


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

Author: Matt Finnicum <mattfinn at gmail.com>
Date:   Wed Aug 16 22:29:17 2006 -0400

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 85f9a20..048c892 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;  




More information about the wine-cvs mailing list