diff --git a/include/wx/osx/cocoa/private/textimpl.h b/include/wx/osx/cocoa/private/textimpl.h index 767f31cddb..aa3300db71 100644 --- a/include/wx/osx/cocoa/private/textimpl.h +++ b/include/wx/osx/cocoa/private/textimpl.h @@ -65,6 +65,8 @@ public: wxNSTextViewControl( wxTextCtrl *wxPeer, WXWidget w ); virtual ~wxNSTextViewControl(); + virtual void insertText(NSString* text, WXWidget slf, void *_cmd); + virtual wxString GetStringValue() const ; virtual void SetStringValue( const wxString &str) ; virtual void Copy() ; diff --git a/src/osx/cocoa/textctrl.mm b/src/osx/cocoa/textctrl.mm index bec0c44431..21408fdcc2 100644 --- a/src/osx/cocoa/textctrl.mm +++ b/src/osx/cocoa/textctrl.mm @@ -586,6 +586,15 @@ bool wxNSTextViewControl::CanFocus() const return true; } +void wxNSTextViewControl::insertText(NSString* text, WXWidget slf, void *_cmd) +{ + if ( m_lastKeyDownEvent ==NULL || !DoHandleCharEvent(m_lastKeyDownEvent, text) ) + { + wxOSX_TextEventHandlerPtr superimpl = (wxOSX_TextEventHandlerPtr) [[slf superclass] instanceMethodForSelector:(SEL)_cmd]; + superimpl(slf, (SEL)_cmd, text); + } +} + wxString wxNSTextViewControl::GetStringValue() const { if (m_textView) diff --git a/src/osx/cocoa/window.mm b/src/osx/cocoa/window.mm index 1dc97c5b5e..ecf5c16a25 100644 --- a/src/osx/cocoa/window.mm +++ b/src/osx/cocoa/window.mm @@ -1388,26 +1388,7 @@ void wxWidgetCocoaImpl::insertText(NSString* text, WXWidget slf, void *_cmd) { // If we don't have a corresponding key event (e.g. IME-composed // characters), send wxEVT_CHAR without sending wxEVT_KEY_DOWN. - for (NSUInteger i = 0; i < [text length]; ++i) - { - wxKeyEvent wxevent(wxEVT_CHAR); - wxevent.m_shiftDown = wxevent.m_controlDown = wxevent.m_altDown = wxevent.m_metaDown = false; - wxevent.m_rawCode = 0; - wxevent.m_rawFlags = 0; - wxevent.SetTimestamp(); - unichar aunichar = [text characterAtIndex:i]; -#if wxUSE_UNICODE - wxevent.m_uniChar = aunichar; -#endif - wxevent.m_keyCode = aunichar < 0x80 ? aunichar : WXK_NONE; - wxWindowMac* peer = GetWXPeer(); - if ( peer ) - { - wxevent.SetEventObject(peer); - wxevent.SetId(peer->GetId()); - } - result = GetWXPeer()->OSXHandleKeyEvent(wxevent) || result; - } + result = DoHandleCharEvent(NULL,text); } } if ( !result ) @@ -2707,16 +2688,29 @@ void wxWidgetCocoaImpl::InstallEventHandler( WXWidget control ) bool wxWidgetCocoaImpl::DoHandleCharEvent(NSEvent *event, NSString *text) { bool result = false; - - for (NSUInteger i = 0; i < [text length]; ++i) + wxWindowMac* peer = GetWXPeer(); + if ( peer ) { - wxKeyEvent wxevent(wxEVT_CHAR); - unichar c = [text characterAtIndex:i]; - SetupKeyEvent( wxevent, event, [NSString stringWithCharacters:&c length:1]); + for (NSUInteger i = 0; i < [text length]; ++i) + { + wxKeyEvent wxevent(wxEVT_CHAR); + wxevent.m_shiftDown = wxevent.m_controlDown = wxevent.m_altDown = wxevent.m_metaDown = false; + wxevent.m_rawCode = 0; + wxevent.m_rawFlags = 0; + if ( event ) + wxevent.SetTimestamp( (int)([event timestamp] * 1000) ) ; + unichar aunichar = [text characterAtIndex:i]; + #if wxUSE_UNICODE + wxevent.m_uniChar = aunichar; + #endif + wxevent.m_keyCode = aunichar < 0x80 ? aunichar : WXK_NONE; - result = GetWXPeer()->OSXHandleKeyEvent(wxevent) || result; + wxevent.SetEventObject(peer); + wxevent.SetId(peer->GetId()); + + result = peer->OSXHandleKeyEvent(wxevent) || result; + } } - return result; }