]> git.saurik.com Git - wxWidgets.git/commitdiff
adding some additional fixes for programmatic selection handling
authorStefan Csomor <csomor@advancedconcepts.ch>
Wed, 28 Nov 2012 20:57:59 +0000 (20:57 +0000)
committerStefan Csomor <csomor@advancedconcepts.ch>
Wed, 28 Nov 2012 20:57:59 +0000 (20:57 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@73053 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/osx/cocoa/private/textimpl.h
src/osx/cocoa/textctrl.mm

index 93c3ab85d4ee672659eba16c34b15cca73152340..6f8d963af58336c1560f9a4121e266116392001c 100644 (file)
@@ -48,6 +48,8 @@ public :
     virtual bool becomeFirstResponder(WXWidget slf, void *_cmd);
     virtual bool resignFirstResponder(WXWidget slf, void *_cmd);
 
     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;
 protected :
     NSTextField* m_textField;
     long m_selStart;
index 6cbc2c06a801cdbcf94e47767db626fda21c9244..5b7fc73310349c95863db02d5c000d654416b002 100644 (file)
@@ -499,6 +499,13 @@ NSView* wxMacEditHelper::ms_viewCurrentlyEdited = nil;
     wxWidgetCocoaImpl* impl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( self );
     if ( impl )
     {
     wxWidgetCocoaImpl* impl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( self );
     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
-    {
-        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)
 }
 
 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
 
 // 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 )
     {
         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)];
             [editor setSelectedRange:NSMakeRange(m_selStart, m_selEnd-m_selStart)];
+        }
     }
     return retval;
 }
     }
     return retval;
 }