X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/16671f229af4d3ff3ca2a6612a8ebc6c89f45c24..53cdd2c11d11b6286936b93158b157610b169edd:/src/osx/cocoa/textctrl.mm diff --git a/src/osx/cocoa/textctrl.mm b/src/osx/cocoa/textctrl.mm index e0bdfdfd20..32464f3636 100644 --- a/src/osx/cocoa/textctrl.mm +++ b/src/osx/cocoa/textctrl.mm @@ -96,15 +96,7 @@ protected : wxUnusedVar(aNotification); wxWidgetCocoaImpl* impl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( self ); if ( impl ) - { - wxWindow* wxpeer = (wxWindow*) impl->GetWXPeer(); - if ( wxpeer ) { - wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, wxpeer->GetId()); - event.SetEventObject( wxpeer ); - event.SetString( static_cast(wxpeer)->GetValue() ); - wxpeer->HandleWindowEvent( event ); - } - } + impl->controlTextDidChange(); } - (void)controlTextDidEndEditing:(NSNotification *)aNotification @@ -192,6 +184,14 @@ protected : } } +- (void)textDidChange:(NSNotification *)aNotification +{ + wxUnusedVar(aNotification); + wxWidgetCocoaImpl* impl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( self ); + if ( impl ) + impl->controlTextDidChange(); +} + @end @implementation wxNSTextField @@ -229,7 +229,6 @@ protected : return fieldEditor; } - - (void) setEnabled:(BOOL) flag { [super setEnabled: flag]; @@ -251,15 +250,7 @@ protected : wxUnusedVar(aNotification); wxWidgetCocoaImpl* impl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( self ); if ( impl ) - { - wxWindow* wxpeer = (wxWindow*) impl->GetWXPeer(); - if ( wxpeer ) { - wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, wxpeer->GetId()); - event.SetEventObject( wxpeer ); - event.SetString( static_cast(wxpeer)->GetValue() ); - wxpeer->HandleWindowEvent( event ); - } - } + impl->controlTextDidChange(); } typedef BOOL (*wxOSX_insertNewlineHandlerPtr)(NSView* self, SEL _cmd, NSControl *control, NSTextView* textView, SEL commandSelector); @@ -300,7 +291,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; @@ -319,7 +312,7 @@ wxNSTextViewControl::wxNSTextViewControl( wxTextCtrl *wxPeer, WXWidget w ) : wxW [m_scrollView setDocumentView: tv]; - [tv setDelegate: w]; + [tv setDelegate: tv]; InstallEventHandler(tv); } @@ -330,6 +323,14 @@ wxNSTextViewControl::~wxNSTextViewControl() [m_textView setDelegate: nil]; } +bool wxNSTextViewControl::CanFocus() const +{ + // since this doesn't work (return false), we hardcode + // if (m_textView) + // return [m_textView canBecomeKeyView]; + return true; +} + wxString wxNSTextViewControl::GetStringValue() const { if (m_textView) @@ -431,16 +432,37 @@ void wxNSTextViewControl::SetFont( const wxFont & font , const wxColour& WXUNUSE bool wxNSTextViewControl::GetStyle(long position, wxTextAttr& style) { - if (m_textView) { - NSTextStorage* storage = [m_textView textStorage]; - NSFont* font = [storage attribute:NSFontAttributeName atIndex:position effectiveRange:NULL]; + if (m_textView && position >=0) + { + NSFont* font = NULL; + NSColor* bgcolor = NULL; + NSColor* fgcolor = NULL; + // 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]) + { + NSTextStorage* storage = [m_textView textStorage]; + font = [[storage attribute:NSFontAttributeName atIndex:position effectiveRange:NULL] autorelease]; + bgcolor = [[storage attribute:NSBackgroundColorAttributeName atIndex:position effectiveRange:NULL] autorelease]; + fgcolor = [[storage attribute:NSForegroundColorAttributeName atIndex:position effectiveRange:NULL] autorelease]; + } + else + { + NSDictionary* attrs = [m_textView typingAttributes]; + font = [[attrs objectForKey:NSFontAttributeName] autorelease]; + bgcolor = [[attrs objectForKey:NSBackgroundColorAttributeName] autorelease]; + fgcolor = [[attrs objectForKey:NSForegroundColorAttributeName] autorelease]; + } + if (font) style.SetFont(wxFont(font)); - NSColor* bgcolor = [storage attribute:NSBackgroundColorAttributeName atIndex:position effectiveRange:NULL]; + if (bgcolor) style.SetBackgroundColour(wxColour(bgcolor)); - NSColor* fgcolor = [storage attribute:NSForegroundColorAttributeName atIndex:position effectiveRange:NULL]; - style.SetTextColour(wxColour(fgcolor)); + + if (fgcolor) + style.SetTextColour(wxColour(fgcolor)); return true; } @@ -453,28 +475,65 @@ void wxNSTextViewControl::SetStyle(long start, { if (m_textView) { NSRange range = NSMakeRange(start, end-start); + if (start == -1 && end == -1) + range = [m_textView selectedRange]; + NSTextStorage* storage = [m_textView textStorage]; wxFont font = style.GetFont(); - if (font.IsOk()) - [storage addAttribute:NSFontAttributeName value:style.GetFont().OSXGetNSFont() range:range]; + if (style.HasFont() && font.IsOk()) + [storage addAttribute:NSFontAttributeName value:font.OSXGetNSFont() range:range]; wxColour bgcolor = style.GetBackgroundColour(); - if (bgcolor.IsOk()) + if (style.HasBackgroundColour() && bgcolor.IsOk()) [storage addAttribute:NSBackgroundColorAttributeName value:bgcolor.OSXGetNSColor() range:range]; wxColour fgcolor = style.GetTextColour(); - if (fgcolor.IsOk()) + if (style.HasTextColour() && fgcolor.IsOk()) [storage addAttribute:NSForegroundColorAttributeName value:fgcolor.OSXGetNSColor() range:range]; } } +void wxNSTextViewControl::CheckSpelling(bool check) +{ + if (m_textView) + [m_textView setContinuousSpellCheckingEnabled: check]; +} + +wxSize wxNSTextViewControl::GetBestSize() const +{ + if (m_textView && [m_textView layoutManager]) + { + NSRect rect = [[m_textView layoutManager] usedRectForTextContainer: [m_textView textContainer]]; + return wxSize((int)(rect.size.width + [m_textView textContainerInset].width), + (int)(rect.size.height + [m_textView textContainerInset].height)); + } + return wxSize(0,0); +} + // wxNSTextFieldControl -wxNSTextFieldControl::wxNSTextFieldControl( wxTextCtrl *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) { - m_textField = (NSTextField*) w; - [m_textField setDelegate: w]; + Init(w); +} + +void wxNSTextFieldControl::Init(WXWidget w) +{ + NSTextField wxOSX_10_6_AND_LATER() *tf = (NSTextField*) w; + m_textField = tf; + [m_textField setDelegate: tf]; m_selStart = m_selEnd = 0; m_hasEditor = [w isKindOfClass:[NSTextField class]]; } @@ -609,7 +668,7 @@ void wxNSTextFieldControl::controlAction(WXWidget WXUNUSED(slf), { wxCommandEvent event(wxEVT_COMMAND_TEXT_ENTER, wxpeer->GetId()); event.SetEventObject( wxpeer ); - event.SetString( static_cast(wxpeer)->GetValue() ); + event.SetString( GetTextEntry()->GetValue() ); wxpeer->HandleWindowEvent( event ); } } @@ -649,11 +708,17 @@ 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 ); } return c;