X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/bc00e7155e50add264599856a39e0ceb2db19541..68a9ef0ef0b8148a2cfc63b14e5b39db9071156e:/src/msw/textctrl.cpp diff --git a/src/msw/textctrl.cpp b/src/msw/textctrl.cpp index 0676f10f0d..caa8d82fe0 100644 --- a/src/msw/textctrl.cpp +++ b/src/msw/textctrl.cpp @@ -28,6 +28,8 @@ #pragma hdrstop #endif +#if wxUSE_TEXTCTRL + #ifndef WX_PRECOMP #include "wx/textctrl.h" #include "wx/settings.h" @@ -54,12 +56,6 @@ #include #include -#if wxUSE_IOSTREAMH -# include -#else -# include -#endif - #if wxUSE_RICHEDIT && (!defined(__GNUWIN32_OLD__) || defined(__CYGWIN10__)) #include #endif @@ -69,6 +65,10 @@ #define CFM_CHARSET 0x08000000 #endif // CFM_CHARSET +#ifndef CFM_BACKCOLOR + #define CFM_BACKCOLOR 0x04000000 +#endif + // ---------------------------------------------------------------------------- // private classes // ---------------------------------------------------------------------------- @@ -298,11 +298,19 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id, #if wxUSE_RICHEDIT if (m_isRich) { - // Have to enable events - ::SendMessage(GetHwnd(), EM_SETEVENTMASK, 0, - ENM_CHANGE | ENM_DROPFILES | ENM_SELCHANGE | ENM_UPDATE); + // have to enable events manually + LPARAM mask = ENM_CHANGE | ENM_DROPFILES | ENM_SELCHANGE | ENM_UPDATE; + + if ( m_windowStyle & wxTE_AUTO_URL ) + { + mask |= ENM_LINK; + + ::SendMessage(GetHwnd(), EM_AUTOURLDETECT, TRUE, 0); + } + + ::SendMessage(GetHwnd(), EM_SETEVENTMASK, 0, mask); } -#endif +#endif // wxUSE_RICHEDIT SubclassWin(GetHWND()); @@ -1170,6 +1178,72 @@ void wxTextCtrl::OnUpdateRedo(wxUpdateUIEvent& event) // the rest of the file only deals with the rich edit controls #if wxUSE_RICHEDIT +// ---------------------------------------------------------------------------- +// EN_LINK processing +// ---------------------------------------------------------------------------- + +bool wxTextCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) +{ + NMHDR *hdr = (NMHDR* )lParam; + if ( hdr->code == EN_LINK ) + { + ENLINK *enlink = (ENLINK *)hdr; + + switch ( enlink->msg ) + { + case WM_SETCURSOR: + // ok, so it is hardcoded - do we really nee to customize it? + ::SetCursor(GetHcursorOf(wxCursor(wxCURSOR_HAND))); + *result = TRUE; + break; + + case WM_MOUSEMOVE: + case WM_LBUTTONDOWN: + case WM_LBUTTONUP: + case WM_LBUTTONDBLCLK: + case WM_RBUTTONDOWN: + case WM_RBUTTONUP: + case WM_RBUTTONDBLCLK: + // send a mouse event + { + static const wxEventType eventsMouse[] = + { + wxEVT_MOTION, + wxEVT_LEFT_DOWN, + wxEVT_LEFT_UP, + wxEVT_LEFT_DCLICK, + wxEVT_RIGHT_DOWN, + wxEVT_RIGHT_UP, + wxEVT_RIGHT_DCLICK, + }; + + // the event ids are consecutive + wxMouseEvent + evtMouse(eventsMouse[enlink->msg - WM_MOUSEMOVE]); + + InitMouseEvent(evtMouse, + GET_X_LPARAM(enlink->lParam), + GET_Y_LPARAM(enlink->lParam), + enlink->wParam); + + wxTextUrlEvent event(m_windowId, evtMouse, + enlink->chrg.cpMin, + enlink->chrg.cpMax); + + InitCommandEvent(event); + + *result = ProcessCommand(event); + } + break; + } + + return TRUE; + } + + // not processed + return FALSE; +} + // ---------------------------------------------------------------------------- // colour setting for the rich edit controls // ---------------------------------------------------------------------------- @@ -1271,7 +1345,8 @@ bool wxTextCtrl::SetStyle(long start, long end, const wxTextAttr& style) if ( style.HasFont() ) { - cf.dwMask |= CFM_FACE | CFM_SIZE | CFM_CHARSET; + cf.dwMask |= CFM_FACE | CFM_SIZE | CFM_CHARSET | + CFM_ITALIC | CFM_BOLD | CFM_UNDERLINE; // fill in data from LOGFONT but recalculate lfHeight because we need // the real height in twips and not the negative number which @@ -1284,22 +1359,21 @@ bool wxTextCtrl::SetStyle(long start, long end, const wxTextAttr& style) cf.bPitchAndFamily = lf.lfPitchAndFamily; wxStrncpy( cf.szFaceName, lf.lfFaceName, WXSIZEOF(cf.szFaceName) ); - // also deal with underline/italic/bold attributes + // also deal with underline/italic/bold attributes: note that we must + // always set CFM_ITALIC &c bits in dwMask, even if we don't set the + // style to allow clearing it if ( lf.lfItalic ) { - cf.dwMask |= CFM_ITALIC; cf.dwEffects |= CFE_ITALIC; } if ( lf.lfWeight == FW_BOLD ) { - cf.dwMask |= CFM_BOLD; cf.dwEffects |= CFE_BOLD; } if ( lf.lfUnderline ) { - cf.dwMask |= CFM_UNDERLINE; cf.dwEffects |= CFE_UNDERLINE; } @@ -1313,16 +1387,13 @@ bool wxTextCtrl::SetStyle(long start, long end, const wxTextAttr& style) } #if wxUSE_RICHEDIT2 -#ifndef CFM_BACKCOLOR -#define CFM_BACKCOLOR 0x04000000 -#endif - if ( wxRichEditModule::GetLoadedVersion() > 1 && style.HasBackgroundColour() ) { cf.dwMask |= CFM_BACKCOLOR; cf.crBackColor = wxColourToRGB(style.GetBackgroundColour()); } -#endif +#endif // wxUSE_RICHEDIT2 + // do format the selection bool ok = ::SendMessage(GetHwnd(), EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf) != 0; @@ -1403,3 +1474,4 @@ bool wxRichEditModule::Load(int version) #endif // wxUSE_RICHEDIT +#endif // wxUSE_TEXTCTRL