X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/715824d58d26ed7df8d55e60ae29b3d2f7966d4e..f941a30bef665561d96d29c4cee07471dbbd497f:/src/osx/cocoa/textctrl.mm diff --git a/src/osx/cocoa/textctrl.mm b/src/osx/cocoa/textctrl.mm index 13b2d97897..9dbb445eed 100644 --- a/src/osx/cocoa/textctrl.mm +++ b/src/osx/cocoa/textctrl.mm @@ -59,7 +59,8 @@ class wxMacEditHelper public : wxMacEditHelper( NSView* textView ) { - m_textView = textView ; + m_textView = textView; + m_formerState = YES; if ( textView ) { m_formerState = [textView isEditable]; @@ -191,6 +192,21 @@ protected : } } +- (void)textDidChange:(NSNotification *)aNotification +{ + wxWidgetCocoaImpl* impl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( [aNotification object] ); + 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 ); + } + } +} + @end @implementation wxNSTextField @@ -318,7 +334,7 @@ wxNSTextViewControl::wxNSTextViewControl( wxTextCtrl *wxPeer, WXWidget w ) : wxW [m_scrollView setDocumentView: tv]; - [tv setDelegate: w]; + [tv setDelegate: tv]; InstallEventHandler(tv); } @@ -422,12 +438,93 @@ void wxNSTextViewControl::WriteText(const wxString& str) m_lastKeyDownEvent = formerEvent; } -void wxNSTextViewControl::SetFont( const wxFont & font , const wxColour& foreground , long windowStyle, bool ignoreBlack ) +void wxNSTextViewControl::SetFont( const wxFont & font , const wxColour& WXUNUSED(foreground) , long WXUNUSED(windowStyle), bool WXUNUSED(ignoreBlack) ) { if ([m_textView respondsToSelector:@selector(setFont:)]) [m_textView setFont: font.OSXGetNSFont()]; } +bool wxNSTextViewControl::GetStyle(long position, wxTextAttr& style) +{ + 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)); + + if (bgcolor) + style.SetBackgroundColour(wxColour(bgcolor)); + + if (fgcolor) + style.SetTextColour(wxColour(fgcolor)); + return true; + } + + return false; +} + +void wxNSTextViewControl::SetStyle(long start, + long end, + const wxTextAttr& style) +{ + 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 (style.HasFont() && font.IsOk()) + [storage addAttribute:NSFontAttributeName value:font.OSXGetNSFont() range:range]; + + wxColour bgcolor = style.GetBackgroundColour(); + if (style.HasBackgroundColour() && bgcolor.IsOk()) + [storage addAttribute:NSBackgroundColorAttributeName value:bgcolor.OSXGetNSColor() range:range]; + + wxColour fgcolor = style.GetTextColour(); + 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]]; + wxSize size = wxSize(rect.size.width, rect.size.height); + size.x += [m_textView textContainerInset].width; + size.y += [m_textView textContainerInset].height; + return size; + } +} // wxNSTextFieldControl @@ -581,7 +678,7 @@ void wxNSTextFieldControl::controlAction(WXWidget WXUNUSED(slf), wxWidgetImplType* wxWidgetImpl::CreateTextControl( wxTextCtrl* wxpeer, wxWindowMac* WXUNUSED(parent), wxWindowID WXUNUSED(id), - const wxString& str, + const wxString& WXUNUSED(str), const wxPoint& pos, const wxSize& size, long style, @@ -595,7 +692,6 @@ wxWidgetImplType* wxWidgetImpl::CreateTextControl( wxTextCtrl* wxpeer, wxNSTextScrollView* v = nil; v = [[wxNSTextScrollView alloc] initWithFrame:r]; c = new wxNSTextViewControl( wxpeer, v ); - static_cast(c)->SetStringValue(str); } else { @@ -615,7 +711,6 @@ wxWidgetImplType* wxWidgetImpl::CreateTextControl( wxTextCtrl* wxpeer, [v setBordered:NO]; c = new wxNSTextFieldControl( wxpeer, v ); - static_cast(c)->SetStringValue(str); } return c;