X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1087c6c1c6345327f7eb2aacc4b8d44b2477ed20..7735b2ea691f41d7a7f007befbe969386873b86e:/src/osx/cocoa/textctrl.mm?ds=inline diff --git a/src/osx/cocoa/textctrl.mm b/src/osx/cocoa/textctrl.mm index ca728cf9db..c9dbe0b1ae 100644 --- a/src/osx/cocoa/textctrl.mm +++ b/src/osx/cocoa/textctrl.mm @@ -49,11 +49,35 @@ #include "wx/osx/private.h" #include "wx/osx/cocoa/private/textimpl.h" -@interface wxNSSecureTextField : NSSecureTextField -{ -} +@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; +} ; + @implementation wxNSSecureTextField + (void)initialize @@ -99,16 +123,6 @@ } @end -@interface wxNSTextView : NSTextView -{ - wxNSTextScrollView* scrollView; -} - -- (void)setScrollView: (wxNSTextScrollView *) sv; -- (wxNSTextScrollView*) scrollView; - -@end - @implementation wxNSTextScrollView + (void)initialize @@ -121,79 +135,60 @@ } } -- (void)textDidChange:(NSNotification *)aNotification +@end + +@implementation wxNSTextFieldEditor + +- (void) keyDown:(NSEvent*) event { - 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 ); - } - } + wxWidgetCocoaImpl* impl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( (WXWidget) [self delegate] ); + lastKeyDownEvent = event; + if ( impl == NULL || !impl->DoHandleKeyEvent(event) ) + [super keyDown:event]; + lastKeyDownEvent = nil; } -- (BOOL)textView:(NSTextView *)aTextView doCommandBySelector:(SEL)commandSelector +- (void) keyUp:(NSEvent*) event { - wxUnusedVar(aTextView); - wxWidgetCocoaImpl* impl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( self ); - if ( impl ) - { - wxWindow* wxpeer = (wxWindow*) impl->GetWXPeer(); - if (commandSelector == @selector(insertNewline:)) - { - if ( wxpeer && wxpeer->GetWindowStyle() & wxTE_PROCESS_ENTER ) - { - wxCommandEvent event(wxEVT_COMMAND_TEXT_ENTER, wxpeer->GetId()); - event.SetEventObject( wxpeer ); - event.SetString( static_cast(wxpeer)->GetValue() ); - wxpeer->HandleWindowEvent( event ); - } - } - } - - return NO; + wxWidgetCocoaImpl* impl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( (WXWidget) [self delegate] ); + if ( impl == NULL || !impl->DoHandleKeyEvent(event) ) + [super keyUp:event]; } -- (void)textDidEndEditing:(NSNotification *)aNotification +- (void) flagsChanged:(NSEvent*) event { - wxUnusedVar(aNotification); - wxWidgetCocoaImpl* impl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( self ); - if ( impl ) - { - impl->DoNotifyFocusEvent( false, NULL ); - } + wxWidgetCocoaImpl* impl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( (WXWidget) [self delegate] ); + if ( impl == NULL || !impl->DoHandleKeyEvent(event) ) + [super flagsChanged:event]; } -@end -@implementation wxNSTextView +- (BOOL) performKeyEquivalent:(NSEvent*) event +{ + BOOL retval = [super performKeyEquivalent:event]; + return retval; +} -- (BOOL) becomeFirstResponder +- (void) insertText:(id) str { - BOOL val = [super becomeFirstResponder]; - - if ( val ) + wxWidgetCocoaImpl* impl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( (WXWidget) [self delegate] ); + if ( impl == NULL || lastKeyDownEvent==nil || !impl->DoHandleCharEvent(lastKeyDownEvent, str) ) { - wxWidgetCocoaImpl* impl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( scrollView ); - if (impl ) - impl->DoNotifyFocusEvent( true, NULL ); - + [super insertText:str]; } - return val; } -- (void)setScrollView: (wxNSTextScrollView *) sv -{ - scrollView = sv; -} +@end -- (wxNSTextScrollView*) scrollView +@implementation wxNSTextView + ++ (void)initialize { - return scrollView; + static BOOL initialized = NO; + if (!initialized) + { + initialized = YES; + wxOSXCocoaClassAddWXMethods( self ); + } } @end @@ -210,6 +205,30 @@ } } +- (id) initWithFrame:(NSRect) frame +{ + self = [super initWithFrame:frame]; + fieldEditor = nil; + return self; +} + +- (void) dealloc +{ + [fieldEditor release]; + [super dealloc]; +} + +- (void) setFieldEditor:(wxNSTextFieldEditor*) editor +{ + fieldEditor = editor; +} + +- (wxNSTextFieldEditor*) fieldEditor +{ + return fieldEditor; +} + + - (void) setEnabled:(BOOL) flag { [super setEnabled: flag]; @@ -300,7 +319,8 @@ wxNSTextViewControl::wxNSTextViewControl( wxTextCtrl *wxPeer, WXWidget w ) : wxW [m_scrollView setDocumentView: tv]; [tv setDelegate: w]; - [tv setScrollView:sv]; + + InstallEventHandler(tv); } wxNSTextViewControl::~wxNSTextViewControl() @@ -314,15 +334,22 @@ 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() { if (m_textView) @@ -365,6 +392,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]; @@ -372,18 +414,28 @@ 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; + m_hasEditor = [w isKindOfClass:[NSTextField class]]; } wxNSTextFieldControl::~wxNSTextFieldControl() @@ -397,10 +449,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]; @@ -447,23 +502,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),