]> git.saurik.com Git - wxWidgets.git/blobdiff - src/osx/cocoa/textctrl.mm
changing disclosure triangle to allow for label
[wxWidgets.git] / src / osx / cocoa / textctrl.mm
index 8ad2937d9771ee41ee3b8403a6ca9ba63ea2b47b..6814c6cdd58d8d4fcc8cfb306b0241540aae7ae4 100644 (file)
 #include "wx/osx/private.h"
 #include "wx/osx/cocoa/private/textimpl.h"
 
+@interface NSView(EditableView) 
+- (BOOL)isEditable;
+- (void)setEditable:(BOOL)flag;
+@end
+
+class wxMacEditHelper
+{
+public :
+    wxMacEditHelper( NSView* textView )
+    {
+        m_textView = textView ;
+        if ( textView )
+        {
+            m_formerState = [textView isEditable];
+            [textView setEditable:YES];
+        }
+    }
+
+    ~wxMacEditHelper()
+    {
+        if ( m_textView )
+            [m_textView setEditable:m_formerState];
+    }
+
+protected :
+    BOOL m_formerState ;
+    NSView* m_textView;
+} ;
+
 @interface wxNSSecureTextField : NSSecureTextField
 {
 }
     }
 }
 
+- (void)controlTextDidEndEditing:(NSNotification *)aNotification
+{
+    wxUnusedVar(aNotification);
+    wxWidgetCocoaImpl* impl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( self );
+    if ( impl )
+    {
+        impl->DoNotifyFocusEvent( false, NULL );
+    }
+}
+
 @end
 
-@interface wxNSTextView : NSScrollView
+@interface wxNSTextScrollView : NSScrollView
 {
 }
+@end
+
+@interface wxNSTextView : NSTextView
+{
+    wxNSTextScrollView* scrollView;
+}
+
+- (void)setScrollView: (wxNSTextScrollView *) sv;
+- (wxNSTextScrollView*) scrollView;
 
 @end
 
-@implementation wxNSTextView
+@implementation wxNSTextScrollView
 
 + (void)initialize
 {
     
     return NO;
 }
+
+- (void)textDidEndEditing:(NSNotification *)aNotification
+{
+    wxUnusedVar(aNotification);
+    wxWidgetCocoaImpl* impl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( self );
+    if ( impl )
+    {
+        impl->DoNotifyFocusEvent( false, NULL );
+    }
+}
+@end
+
+@implementation wxNSTextView
+
+- (BOOL) becomeFirstResponder
+{
+    BOOL val = [super becomeFirstResponder];
+    
+    if ( val )
+    {
+        wxWidgetCocoaImpl* impl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( scrollView );
+        if (impl )
+            impl->DoNotifyFocusEvent( true, NULL );
+
+    }
+    return val;
+}
+
+- (void)setScrollView: (wxNSTextScrollView *) sv
+{
+    scrollView = sv;
+}
+
+- (wxNSTextScrollView*) scrollView
+{
+    return scrollView;
+}
+
 @end
 
 @implementation wxNSTextField
@@ -209,43 +295,41 @@ typedef BOOL (*wxOSX_insertNewlineHandlerPtr)(NSView* self, SEL _cmd, NSControl
     
     return NO;
 }
-/*
+
 - (void)controlTextDidEndEditing:(NSNotification *)aNotification
 {
+    wxUnusedVar(aNotification);
+    wxWidgetCocoaImpl* impl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( self );
     if ( impl )
     {
-        wxWindow* wxpeer = (wxWindow*) impl->GetWXPeer();
-        if ( wxpeer ) {
-            wxFocusEvent event(wxEVT_KILL_FOCUS, wxpeer->GetId());
-            event.SetEventObject( wxpeer );
-            event.SetWindow( wxpeer );
-            wxpeer->HandleWindowEvent( event );
-        }
+        impl->DoNotifyFocusEvent( false, NULL );
     }
 }
-*/
 @end
 
 // wxNSTextViewControl
 
 wxNSTextViewControl::wxNSTextViewControl( wxTextCtrl *wxPeer, WXWidget w ) : wxWidgetCocoaImpl(wxPeer, w)
 {
-    m_scrollView = (NSScrollView*) w;
+    wxNSTextScrollView* sv = (wxNSTextScrollView*) w;
+    m_scrollView = sv;
     
     [m_scrollView setHasVerticalScroller:YES];
     [m_scrollView setHasHorizontalScroller:NO];
     [m_scrollView setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable];
     NSSize contentSize = [m_scrollView contentSize];
     
-    m_textView = [[NSTextView alloc] initWithFrame: NSMakeRect(0, 0,
+    wxNSTextView* tv = [[wxNSTextView alloc] initWithFrame: NSMakeRect(0, 0,
             contentSize.width, contentSize.height)];
-    [m_textView setVerticallyResizable:YES];
-    [m_textView setHorizontallyResizable:NO];
-    [m_textView setAutoresizingMask:NSViewWidthSizable];
+    m_textView = tv;
+    [tv setVerticallyResizable:YES];
+    [tv setHorizontallyResizable:NO];
+    [tv setAutoresizingMask:NSViewWidthSizable];
     
-    [m_scrollView setDocumentView: m_textView];
+    [m_scrollView setDocumentView: tv];
 
-    [m_textView setDelegate: w];
+    [tv setDelegate: w];
+    [tv setScrollView:sv];
 }
 
 wxNSTextViewControl::~wxNSTextViewControl()
@@ -259,14 +343,20 @@ wxString wxNSTextViewControl::GetStringValue() const
     if (m_textView) 
     {
         wxCFStringRef cf( (CFStringRef) [[m_textView string] retain] );
-        return cf.AsString(m_wxPeer->GetFont().GetEncoding());
+        wxString result = cf.AsString(m_wxPeer->GetFont().GetEncoding());
+        wxMacConvertNewlines13To10( &result ) ;
+        return result;
     }
     return wxEmptyString;
 }
 void wxNSTextViewControl::SetStringValue( const wxString &str) 
 {
+    wxString st = str;
+    wxMacConvertNewlines10To13( &st );
+    wxMacEditHelper helper(m_textView);
+
     if (m_textView)
-        [m_textView setString: wxCFStringRef( str , m_wxPeer->GetFont().GetEncoding() ).AsNSString()];
+        [m_textView setString: wxCFStringRef( st , m_wxPeer->GetFont().GetEncoding() ).AsNSString()];
 }
 void wxNSTextViewControl::Copy() 
 {
@@ -310,6 +400,21 @@ void wxNSTextViewControl::GetSelection( long* from, long* to) const
 
 void wxNSTextViewControl::SetSelection( long from , long to )
 {
+    long textLength = [[m_textView string] length];
+    if ((from == -1) && (to == -1))
+    {
+        from = 0 ;
+        to = textLength ;
+    }
+    else
+    {
+        from = wxMin(textLength,wxMax(from,0)) ;
+        if ( to == -1 )
+            to = textLength;
+        else
+            to = wxMax(0,wxMin(textLength,to)) ;
+    }
+
     NSRange selrange = NSMakeRange(from, to-from);
     [m_textView setSelectedRange:selrange];
     [m_textView scrollRangeToVisible:selrange];
@@ -317,18 +422,27 @@ void wxNSTextViewControl::SetSelection( long from , long to )
 
 void wxNSTextViewControl::WriteText(const wxString& str) 
 {
-    // temp hack to get logging working early
-    wxString former = GetStringValue();
-    SetStringValue( former + str );
-    SetSelection(GetStringValue().length(), GetStringValue().length());
+    wxString st = str;
+    wxMacConvertNewlines10To13( &st );
+    wxMacEditHelper helper(m_textView);
+    
+    [m_textView insertText:wxCFStringRef( st , m_wxPeer->GetFont().GetEncoding() ).AsNSString()];
 }
 
+void wxNSTextViewControl::SetFont( const wxFont & font , const wxColour& foreground , long windowStyle, bool ignoreBlack )
+{
+    if ([m_textView respondsToSelector:@selector(setFont:)])
+        [m_textView setFont: font.OSXGetNSFont()];
+}
+
+
 // wxNSTextFieldControl
 
 wxNSTextFieldControl::wxNSTextFieldControl( wxTextCtrl *wxPeer, WXWidget w ) : wxWidgetCocoaImpl(wxPeer, w)
 {
     m_textField = (NSTextField*) w;
     [m_textField setDelegate: w];
+    m_selStart = m_selEnd = 0;
 }
 
 wxNSTextFieldControl::~wxNSTextFieldControl()
@@ -342,10 +456,13 @@ wxString wxNSTextFieldControl::GetStringValue() const
     wxCFStringRef cf( (CFStringRef) [[m_textField stringValue] retain] );
     return cf.AsString(m_wxPeer->GetFont().GetEncoding());
 }
+
 void wxNSTextFieldControl::SetStringValue( const wxString &str) 
 {
+    wxMacEditHelper helper(m_textField);
     [m_textField setStringValue: wxCFStringRef( str , m_wxPeer->GetFont().GetEncoding() ).AsNSString()];
 }
+
 void wxNSTextFieldControl::Copy() 
 {
     NSText* editor = [m_textField currentEditor];
@@ -392,23 +509,60 @@ void wxNSTextFieldControl::GetSelection( long* from, long* to) const
         *from = range.location;
         *to = range.location + range.length;
     }
+    else
+    {
+        *from = m_selStart;
+        *to = m_selEnd;
+    }
 }
 
 void wxNSTextFieldControl::SetSelection( long from , long to )
 {
+    long textLength = [[m_textField stringValue] length];
+    if ((from == -1) && (to == -1))
+    {
+        from = 0 ;
+        to = textLength ;
+    }
+    else
+    {
+        from = wxMin(textLength,wxMax(from,0)) ;
+        if ( to == -1 )
+            to = textLength;
+        else
+            to = wxMax(0,wxMin(textLength,to)) ;
+    }
+
     NSText* editor = [m_textField currentEditor];
     if ( editor )
     {
         [editor setSelectedRange:NSMakeRange(from, to-from)];
     }
+    else
+    {
+        m_selStart = from;
+        m_selEnd = to;
+    }
 }
 
 void wxNSTextFieldControl::WriteText(const wxString& str) 
 {
-    // temp hack to get logging working early
-    wxString former = GetStringValue();
-    SetStringValue( former + str );
-    SetSelection(GetStringValue().length(), GetStringValue().length());
+    NSText* editor = [m_textField currentEditor];
+    if ( editor )
+    {
+        wxMacEditHelper helper(m_textField);
+        [editor insertText:wxCFStringRef( str , m_wxPeer->GetFont().GetEncoding() ).AsNSString()];
+    }
+    else
+    {
+        wxString val = GetStringValue() ;
+        long start , end ;
+        GetSelection( &start , &end ) ;
+        val.Remove( start , end - start ) ;
+        val.insert( start , str ) ;
+        SetStringValue( val ) ;
+        SetSelection( start + str.length() , start + str.length() ) ;
+    }
 }
 
 void wxNSTextFieldControl::controlAction(WXWidget WXUNUSED(slf), 
@@ -442,8 +596,8 @@ wxWidgetImplType* wxWidgetImpl::CreateTextControl( wxTextCtrl* wxpeer,
     
     if ( style & wxTE_MULTILINE || style & wxTE_RICH || style & wxTE_RICH2 )
     {
-        wxNSTextView* v = nil;
-        v = [[wxNSTextView alloc] initWithFrame:r];
+        wxNSTextScrollView* v = nil;
+        v = [[wxNSTextScrollView alloc] initWithFrame:r];
         c = new wxNSTextViewControl( wxpeer, v );
         static_cast<wxNSTextViewControl*>(c)->SetStringValue(str);
     }