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
This commit is contained in:
Stefan Csomor
2012-11-28 20:57:59 +00:00
parent bc4a20051e
commit 8e64b8fe6e
2 changed files with 26 additions and 5 deletions

View File

@@ -48,6 +48,8 @@ public :
virtual bool becomeFirstResponder(WXWidget slf, void *_cmd); virtual bool becomeFirstResponder(WXWidget slf, void *_cmd);
virtual bool resignFirstResponder(WXWidget slf, void *_cmd); virtual bool resignFirstResponder(WXWidget slf, void *_cmd);
virtual void SetInternalSelection( long from , long to );
protected : protected :
NSTextField* m_textField; NSTextField* m_textField;
long m_selStart; long m_selStart;

View File

@@ -499,6 +499,13 @@ NSView* wxMacEditHelper::ms_viewCurrentlyEdited = nil;
wxWidgetCocoaImpl* impl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( self ); wxWidgetCocoaImpl* impl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( self );
if ( impl ) if ( impl )
{ {
wxNSTextFieldControl* timpl = dynamic_cast<wxNSTextFieldControl*>(impl);
if ( fieldEditor )
{
NSRange range = [fieldEditor selectedRange];
timpl->SetInternalSelection(range.location, range.location + range.length);
}
impl->DoNotifyFocusEvent( false, NULL ); impl->DoNotifyFocusEvent( false, NULL );
} }
} }
@@ -864,11 +871,11 @@ void wxNSTextFieldControl::SetSelection( long from , long to )
{ {
[editor setSelectedRange:NSMakeRange(from, to-from)]; [editor setSelectedRange:NSMakeRange(from, to-from)];
} }
else
{ // 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_selStart = from;
m_selEnd = to; m_selEnd = to;
}
} }
void wxNSTextFieldControl::WriteText(const wxString& str) 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 // 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 // the resign notification writing back native selection values before we can set our own
@@ -926,8 +939,14 @@ bool wxNSTextFieldControl::becomeFirstResponder(WXWidget slf, void *_cmd)
{ {
NSText* editor = [m_textField currentEditor]; NSText* editor = [m_textField currentEditor];
if ( editor ) 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)]; [editor setSelectedRange:NSMakeRange(m_selStart, m_selEnd-m_selStart)];
} }
}
return retval; return retval;
} }