From 8e64b8fe6ee78b9148d2f48a31aace0bcfc0d751 Mon Sep 17 00:00:00 2001 From: Stefan Csomor Date: Wed, 28 Nov 2012 20:57:59 +0000 Subject: [PATCH] adding some additional fixes for programmatic selection handling git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@73053 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/osx/cocoa/private/textimpl.h | 2 ++ src/osx/cocoa/textctrl.mm | 29 ++++++++++++++++++++----- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/include/wx/osx/cocoa/private/textimpl.h b/include/wx/osx/cocoa/private/textimpl.h index 93c3ab85d4..6f8d963af5 100644 --- a/include/wx/osx/cocoa/private/textimpl.h +++ b/include/wx/osx/cocoa/private/textimpl.h @@ -48,6 +48,8 @@ public : virtual bool becomeFirstResponder(WXWidget slf, void *_cmd); virtual bool resignFirstResponder(WXWidget slf, void *_cmd); + virtual void SetInternalSelection( long from , long to ); + protected : NSTextField* m_textField; long m_selStart; diff --git a/src/osx/cocoa/textctrl.mm b/src/osx/cocoa/textctrl.mm index 6cbc2c06a8..5b7fc73310 100644 --- a/src/osx/cocoa/textctrl.mm +++ b/src/osx/cocoa/textctrl.mm @@ -499,6 +499,13 @@ NSView* wxMacEditHelper::ms_viewCurrentlyEdited = nil; wxWidgetCocoaImpl* impl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( self ); if ( impl ) { + wxNSTextFieldControl* timpl = dynamic_cast(impl); + if ( fieldEditor ) + { + NSRange range = [fieldEditor selectedRange]; + timpl->SetInternalSelection(range.location, range.location + range.length); + } + impl->DoNotifyFocusEvent( false, NULL ); } } @@ -864,11 +871,11 @@ void wxNSTextFieldControl::SetSelection( long from , long to ) { [editor setSelectedRange:NSMakeRange(from, to-from)]; } - else - { - m_selStart = from; - m_selEnd = to; - } + + // the editor might still be in existence, but we might be already passed our 'focus lost' storage + // of the selection, so make sure we copy this + m_selStart = from; + m_selEnd = to; } void wxNSTextFieldControl::WriteText(const wxString& str) @@ -912,6 +919,12 @@ void wxNSTextFieldControl::controlAction(WXWidget WXUNUSED(slf), } } +void wxNSTextFieldControl::SetInternalSelection( long from , long to ) +{ + m_selStart = from; + m_selEnd = to; +} + // as becoming first responder on a window - triggers a resign on the same control, we have to avoid // the resign notification writing back native selection values before we can set our own @@ -926,7 +939,13 @@ bool wxNSTextFieldControl::becomeFirstResponder(WXWidget slf, void *_cmd) { NSText* editor = [m_textField currentEditor]; if ( editor ) + { + long textLength = [[m_textField stringValue] length]; + m_selStart = wxMin(textLength,wxMax(m_selStart,0)) ; + m_selEnd = wxMax(0,wxMin(textLength,m_selEnd)) ; + [editor setSelectedRange:NSMakeRange(m_selStart, m_selEnd-m_selStart)]; + } } return retval; } -- 2.45.2