]> git.saurik.com Git - wxWidgets.git/blobdiff - src/osx/cocoa/textctrl.mm
signed/unsigned warning fix
[wxWidgets.git] / src / osx / cocoa / textctrl.mm
index ced1a2369d6bfac1357266557f677b7f68fac776..8ae0ed764c8f8c34248d190a6ef16438416ea541 100644 (file)
@@ -52,6 +52,8 @@
 @interface NSView(EditableView)
 - (BOOL)isEditable;
 - (void)setEditable:(BOOL)flag;
+- (BOOL)isSelectable;
+- (void)setSelectable:(BOOL)flag;
 @end
 
 class wxMacEditHelper
@@ -60,10 +62,11 @@ public :
     wxMacEditHelper( NSView* textView )
     {
         m_textView = textView;
-        m_formerState = YES;
+        m_formerEditable = YES;
         if ( textView )
         {
-            m_formerState = [textView isEditable];
+            m_formerEditable = [textView isEditable];
+            m_formerSelectable = [textView isSelectable];
             [textView setEditable:YES];
         }
     }
@@ -71,11 +74,15 @@ public :
     ~wxMacEditHelper()
     {
         if ( m_textView )
-            [m_textView setEditable:m_formerState];
+        {
+            [m_textView setEditable:m_formerEditable];
+            [m_textView setSelectable:m_formerSelectable];
+        }
     }
 
 protected :
-    BOOL m_formerState ;
+    BOOL m_formerEditable ;
+    BOOL m_formerSelectable;
     NSView* m_textView;
 } ;
 
@@ -192,6 +199,35 @@ protected :
         impl->controlTextDidChange();
 }
 
+- (void) setEnabled:(BOOL) flag
+{
+    // from Technical Q&A QA1461
+    if (flag) {
+        [self setTextColor: [NSColor controlTextColor]];
+
+    } else {
+        [self setTextColor: [NSColor disabledControlTextColor]];
+    }
+
+    [self setSelectable: flag];
+    [self setEditable: flag];
+}
+
+- (BOOL) isEnabled
+{
+    return [self isEditable];
+}
+
+- (void)textDidEndEditing:(NSNotification *)aNotification
+{
+    wxUnusedVar(aNotification);
+    wxWidgetCocoaImpl* impl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( self );
+    if ( impl )
+    {
+        impl->DoNotifyFocusEvent( false, NULL );
+    }
+}
+
 @end
 
 @implementation wxNSTextField
@@ -253,29 +289,40 @@ protected :
         impl->controlTextDidChange();
 }
 
-typedef BOOL (*wxOSX_insertNewlineHandlerPtr)(NSView* self, SEL _cmd, NSControl *control, NSTextView* textView, SEL commandSelector);
-
 - (BOOL)control:(NSControl*)control textView:(NSTextView*)textView doCommandBySelector:(SEL)commandSelector
 {
     wxUnusedVar(textView);
     wxUnusedVar(control);
-    if (commandSelector == @selector(insertNewline:))
+    
+    BOOL handled = NO;
+
+    // send back key events wx' common code knows how to handle
+    
+    wxWidgetCocoaImpl* impl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( self );
+    if ( impl  )
     {
-        wxWidgetCocoaImpl* impl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( self );
-        if ( impl  )
+        wxWindow* wxpeer = (wxWindow*) impl->GetWXPeer();
+        if ( wxpeer )
         {
-            wxWindow* wxpeer = (wxWindow*) impl->GetWXPeer();
-            if ( wxpeer && wxpeer->GetWindowStyle() & wxTE_PROCESS_ENTER )
+            if (commandSelector == @selector(insertNewline:))
+            {
+                [textView insertNewlineIgnoringFieldEditor:self];
+                handled = YES;
+            }
+            else if ( commandSelector == @selector(insertTab:))
+            {
+                [textView insertTabIgnoringFieldEditor:self];
+                handled = YES;
+            }
+            else if ( commandSelector == @selector(insertBacktab:))
             {
-                wxCommandEvent event(wxEVT_COMMAND_TEXT_ENTER, wxpeer->GetId());
-                event.SetEventObject( wxpeer );
-                event.SetString( static_cast<wxTextCtrl*>(wxpeer)->GetValue() );
-                wxpeer->HandleWindowEvent( event );
+                [textView insertTabIgnoringFieldEditor:self];
+                handled = YES;
             }
         }
     }
-
-    return NO;
+    
+    return handled;
 }
 
 - (void)controlTextDidEndEditing:(NSNotification *)aNotification
@@ -291,7 +338,9 @@ typedef BOOL (*wxOSX_insertNewlineHandlerPtr)(NSView* self, SEL _cmd, NSControl
 
 // wxNSTextViewControl
 
-wxNSTextViewControl::wxNSTextViewControl( wxTextCtrl *wxPeer, WXWidget w ) : wxWidgetCocoaImpl(wxPeer, w)
+wxNSTextViewControl::wxNSTextViewControl( wxTextCtrl *wxPeer, WXWidget w )
+    : wxWidgetCocoaImpl(wxPeer, w),
+      wxTextWidgetImpl(wxPeer)
 {
     wxNSTextScrollView* sv = (wxNSTextScrollView*) w;
     m_scrollView = sv;
@@ -438,7 +487,7 @@ bool wxNSTextViewControl::GetStyle(long position, wxTextAttr& style)
         // NOTE: It appears that other platforms accept GetStyle with the position == length
         // but that NSTextStorage does not accept length as a valid position.
         // Therefore we return the default control style in that case.
-        if (position < [[m_textView string] length]) 
+        if (position < (long) [[m_textView string] length]) 
         {
             NSTextStorage* storage = [m_textView textStorage];
             font = [[storage attribute:NSFontAttributeName atIndex:position effectiveRange:NULL] autorelease];
@@ -511,7 +560,23 @@ wxSize wxNSTextViewControl::GetBestSize() const
 
 // wxNSTextFieldControl
 
-wxNSTextFieldControl::wxNSTextFieldControl( wxWindow *wxPeer, WXWidget w ) : wxWidgetCocoaImpl(wxPeer, w)
+wxNSTextFieldControl::wxNSTextFieldControl( wxTextCtrl *text, WXWidget w )
+    : wxWidgetCocoaImpl(text, w),
+      wxTextWidgetImpl(text)
+{
+    Init(w);
+}
+
+wxNSTextFieldControl::wxNSTextFieldControl(wxWindow *wxPeer,
+                                           wxTextEntry *entry,
+                                           WXWidget w)
+    : wxWidgetCocoaImpl(wxPeer, w),
+      wxTextWidgetImpl(entry)
+{
+    Init(w);
+}
+
+void wxNSTextFieldControl::Init(WXWidget w)
 {
     NSTextField wxOSX_10_6_AND_LATER(<NSTextFieldDelegate>) *tf = (NSTextField*) w;
     m_textField = tf;
@@ -650,11 +715,18 @@ void wxNSTextFieldControl::controlAction(WXWidget WXUNUSED(slf),
     {
         wxCommandEvent event(wxEVT_COMMAND_TEXT_ENTER, wxpeer->GetId());
         event.SetEventObject( wxpeer );
-        event.SetString( static_cast<wxTextCtrl*>(wxpeer)->GetValue() );
+        event.SetString( GetTextEntry()->GetValue() );
         wxpeer->HandleWindowEvent( event );
     }
 }
 
+bool wxNSTextFieldControl::SetHint(const wxString& hint)
+{
+    wxCFStringRef hintstring(hint);
+    [[m_textField cell] setPlaceholderString:hintstring.AsNSString()];
+    return true;
+}
+
 //
 //
 //
@@ -690,12 +762,19 @@ wxWidgetImplType* wxWidgetImpl::CreateTextControl( wxTextCtrl* wxpeer,
             // FIXME: How can we remove the native control's border?
             // setBordered is separate from the text ctrl's border.
         }
+        
+        NSTextFieldCell* cell = [v cell];
+        [cell setScrollable:YES];
+        // TODO: Remove if we definitely are sure, it's not needed
+        // as setting scrolling to yes, should turn off any wrapping
+        // [cell setLineBreakMode:NSLineBreakByClipping]; 
 
         [v setBezeled:NO];
         [v setBordered:NO];
 
-        c = new wxNSTextFieldControl( wxpeer, v );
+        c = new wxNSTextFieldControl( wxpeer, wxpeer, v );
     }
+    c->SetNeedsFocusRect( true );
 
     return c;
 }