From b0a5f5ac180f6e2f168090a64b2d33ae452940cf Mon Sep 17 00:00:00 2001 From: Stefan Csomor Date: Sat, 21 Dec 2013 14:59:50 +0000 Subject: [PATCH] - one single method for sending char events from a NSString - adding insertText override for multiline fields as char events went missing after r74945 git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@75405 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/osx/cocoa/private/textimpl.h | 2 ++ src/osx/cocoa/textctrl.mm | 9 +++++ src/osx/cocoa/window.mm | 48 +++++++++++-------------- 3 files changed, 32 insertions(+), 27 deletions(-) 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; }