X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f95dd972d9ec5d22f5996f56b9757af0bf3ca397..713129f9d34e3027d2be46b134d2f4c490ad145f:/src/osx/cocoa/textctrl.mm diff --git a/src/osx/cocoa/textctrl.mm b/src/osx/cocoa/textctrl.mm index 6814c6cdd5..14bfab4447 100644 --- a/src/osx/cocoa/textctrl.mm +++ b/src/osx/cocoa/textctrl.mm @@ -49,7 +49,7 @@ #include "wx/osx/private.h" #include "wx/osx/cocoa/private/textimpl.h" -@interface NSView(EditableView) +@interface NSView(EditableView) - (BOOL)isEditable; - (void)setEditable:(BOOL)flag; @end @@ -78,17 +78,12 @@ protected : NSView* m_textView; } ; -@interface wxNSSecureTextField : NSSecureTextField -{ -} -@end - -@implementation wxNSSecureTextField +@implementation wxNSSecureTextField + (void)initialize { static BOOL initialized = NO; - if (!initialized) + if (!initialized) { initialized = YES; wxOSXCocoaClassAddWXMethods( self ); @@ -128,101 +123,72 @@ protected : } @end -@interface wxNSTextView : NSTextView -{ - wxNSTextScrollView* scrollView; -} - -- (void)setScrollView: (wxNSTextScrollView *) sv; -- (wxNSTextScrollView*) scrollView; - -@end - @implementation wxNSTextScrollView + (void)initialize { static BOOL initialized = NO; - if (!initialized) - { + if (!initialized) + { initialized = YES; wxOSXCocoaClassAddWXMethods( self ); } } -- (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 + +@implementation wxNSTextView -- (wxNSTextScrollView*) scrollView ++ (void)initialize { - return scrollView; + static BOOL initialized = NO; + if (!initialized) + { + initialized = YES; + wxOSXCocoaClassAddWXMethods( self ); + } } @end @@ -232,13 +198,37 @@ protected : + (void)initialize { static BOOL initialized = NO; - if (!initialized) + if (!initialized) { initialized = YES; wxOSXCocoaClassAddWXMethods( self ); } } +- (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]; @@ -283,7 +273,7 @@ typedef BOOL (*wxOSX_insertNewlineHandlerPtr)(NSView* self, SEL _cmd, NSControl if ( impl ) { wxWindow* wxpeer = (wxWindow*) impl->GetWXPeer(); - if ( wxpeer && wxpeer->GetWindowStyle() & wxTE_PROCESS_ENTER ) + if ( wxpeer && wxpeer->GetWindowStyle() & wxTE_PROCESS_ENTER ) { wxCommandEvent event(wxEVT_COMMAND_TEXT_ENTER, wxpeer->GetId()); event.SetEventObject( wxpeer ); @@ -292,7 +282,7 @@ typedef BOOL (*wxOSX_insertNewlineHandlerPtr)(NSView* self, SEL _cmd, NSControl } } } - + return NO; } @@ -313,23 +303,24 @@ wxNSTextViewControl::wxNSTextViewControl( wxTextCtrl *wxPeer, WXWidget w ) : wxW { 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]; - + wxNSTextView* tv = [[wxNSTextView alloc] initWithFrame: NSMakeRect(0, 0, contentSize.width, contentSize.height)]; m_textView = tv; [tv setVerticallyResizable:YES]; [tv setHorizontallyResizable:NO]; [tv setAutoresizingMask:NSViewWidthSizable]; - + [m_scrollView setDocumentView: tv]; [tv setDelegate: w]; - [tv setScrollView:sv]; + + InstallEventHandler(tv); } wxNSTextViewControl::~wxNSTextViewControl() @@ -338,18 +329,17 @@ wxNSTextViewControl::~wxNSTextViewControl() [m_textView setDelegate: nil]; } -wxString wxNSTextViewControl::GetStringValue() const +wxString wxNSTextViewControl::GetStringValue() const { - if (m_textView) + if (m_textView) { - wxCFStringRef cf( (CFStringRef) [[m_textView string] retain] ); - wxString result = cf.AsString(m_wxPeer->GetFont().GetEncoding()); + wxString result = wxCFStringRef::AsString([m_textView string], m_wxPeer->GetFont().GetEncoding()); wxMacConvertNewlines13To10( &result ) ; return result; } return wxEmptyString; } -void wxNSTextViewControl::SetStringValue( const wxString &str) +void wxNSTextViewControl::SetStringValue( const wxString &str) { wxString st = str; wxMacConvertNewlines10To13( &st ); @@ -358,37 +348,38 @@ void wxNSTextViewControl::SetStringValue( const wxString &str) if (m_textView) [m_textView setString: wxCFStringRef( st , m_wxPeer->GetFont().GetEncoding() ).AsNSString()]; } -void wxNSTextViewControl::Copy() + +void wxNSTextViewControl::Copy() { if (m_textView) [m_textView copy:nil]; } -void wxNSTextViewControl::Cut() +void wxNSTextViewControl::Cut() { if (m_textView) [m_textView cut:nil]; } -void wxNSTextViewControl::Paste() +void wxNSTextViewControl::Paste() { if (m_textView) [m_textView paste:nil]; } -bool wxNSTextViewControl::CanPaste() const -{ +bool wxNSTextViewControl::CanPaste() const +{ return true; } -void wxNSTextViewControl::SetEditable(bool editable) +void wxNSTextViewControl::SetEditable(bool editable) { if (m_textView) [m_textView setEditable: editable]; } -void wxNSTextViewControl::GetSelection( long* from, long* to) const +void wxNSTextViewControl::GetSelection( long* from, long* to) const { if (m_textView) { @@ -420,12 +411,12 @@ void wxNSTextViewControl::SetSelection( long from , long to ) [m_textView scrollRangeToVisible:selrange]; } -void wxNSTextViewControl::WriteText(const wxString& str) +void wxNSTextViewControl::WriteText(const wxString& str) { wxString st = str; wxMacConvertNewlines10To13( &st ); wxMacEditHelper helper(m_textView); - + [m_textView insertText:wxCFStringRef( st , m_wxPeer->GetFont().GetEncoding() ).AsNSString()]; } @@ -443,6 +434,7 @@ wxNSTextFieldControl::wxNSTextFieldControl( wxTextCtrl *wxPeer, WXWidget w ) : w m_textField = (NSTextField*) w; [m_textField setDelegate: w]; m_selStart = m_selEnd = 0; + m_hasEditor = [w isKindOfClass:[NSTextField class]]; } wxNSTextFieldControl::~wxNSTextFieldControl() @@ -451,19 +443,18 @@ wxNSTextFieldControl::~wxNSTextFieldControl() [m_textField setDelegate: nil]; } -wxString wxNSTextFieldControl::GetStringValue() const +wxString wxNSTextFieldControl::GetStringValue() const { - wxCFStringRef cf( (CFStringRef) [[m_textField stringValue] retain] ); - return cf.AsString(m_wxPeer->GetFont().GetEncoding()); + return wxCFStringRef::AsString([m_textField stringValue], m_wxPeer->GetFont().GetEncoding()); } -void wxNSTextFieldControl::SetStringValue( const wxString &str) +void wxNSTextFieldControl::SetStringValue( const wxString &str) { wxMacEditHelper helper(m_textField); [m_textField setStringValue: wxCFStringRef( str , m_wxPeer->GetFont().GetEncoding() ).AsNSString()]; } -void wxNSTextFieldControl::Copy() +void wxNSTextFieldControl::Copy() { NSText* editor = [m_textField currentEditor]; if ( editor ) @@ -472,7 +463,7 @@ void wxNSTextFieldControl::Copy() } } -void wxNSTextFieldControl::Cut() +void wxNSTextFieldControl::Cut() { NSText* editor = [m_textField currentEditor]; if ( editor ) @@ -481,7 +472,7 @@ void wxNSTextFieldControl::Cut() } } -void wxNSTextFieldControl::Paste() +void wxNSTextFieldControl::Paste() { NSText* editor = [m_textField currentEditor]; if ( editor ) @@ -490,17 +481,17 @@ void wxNSTextFieldControl::Paste() } } -bool wxNSTextFieldControl::CanPaste() const -{ +bool wxNSTextFieldControl::CanPaste() const +{ return true; } -void wxNSTextFieldControl::SetEditable(bool editable) +void wxNSTextFieldControl::SetEditable(bool editable) { [m_textField setEditable:editable]; } -void wxNSTextFieldControl::GetSelection( long* from, long* to) const +void wxNSTextFieldControl::GetSelection( long* from, long* to) const { NSText* editor = [m_textField currentEditor]; if ( editor ) @@ -545,7 +536,7 @@ void wxNSTextFieldControl::SetSelection( long from , long to ) } } -void wxNSTextFieldControl::WriteText(const wxString& str) +void wxNSTextFieldControl::WriteText(const wxString& str) { NSText* editor = [m_textField currentEditor]; if ( editor ) @@ -565,11 +556,11 @@ void wxNSTextFieldControl::WriteText(const wxString& str) } } -void wxNSTextFieldControl::controlAction(WXWidget WXUNUSED(slf), +void wxNSTextFieldControl::controlAction(WXWidget WXUNUSED(slf), void* WXUNUSED(_cmd), void *WXUNUSED(sender)) { wxWindow* wxpeer = (wxWindow*) GetWXPeer(); - if ( wxpeer && (wxpeer->GetWindowStyle() & wxTE_PROCESS_ENTER) ) + if ( wxpeer && (wxpeer->GetWindowStyle() & wxTE_PROCESS_ENTER) ) { wxCommandEvent event(wxEVT_COMMAND_TEXT_ENTER, wxpeer->GetId()); event.SetEventObject( wxpeer ); @@ -582,18 +573,18 @@ void wxNSTextFieldControl::controlAction(WXWidget WXUNUSED(slf), // // -wxWidgetImplType* wxWidgetImpl::CreateTextControl( wxTextCtrl* wxpeer, - wxWindowMac* WXUNUSED(parent), - wxWindowID WXUNUSED(id), +wxWidgetImplType* wxWidgetImpl::CreateTextControl( wxTextCtrl* wxpeer, + wxWindowMac* WXUNUSED(parent), + wxWindowID WXUNUSED(id), const wxString& str, - const wxPoint& pos, + const wxPoint& pos, const wxSize& size, - long style, + long style, long WXUNUSED(extraStyle)) { NSRect r = wxOSXGetFrameForControl( wxpeer, pos , size ) ; wxWidgetCocoaImpl* c = NULL; - + if ( style & wxTE_MULTILINE || style & wxTE_RICH || style & wxTE_RICH2 ) { wxNSTextScrollView* v = nil; @@ -601,27 +592,27 @@ wxWidgetImplType* wxWidgetImpl::CreateTextControl( wxTextCtrl* wxpeer, c = new wxNSTextViewControl( wxpeer, v ); static_cast(c)->SetStringValue(str); } - else + else { NSTextField* v = nil; if ( style & wxTE_PASSWORD ) v = [[wxNSSecureTextField alloc] initWithFrame:r]; else v = [[wxNSTextField alloc] initWithFrame:r]; - + if ( style & wxNO_BORDER ) { // FIXME: How can we remove the native control's border? // setBordered is separate from the text ctrl's border. } - + [v setBezeled:NO]; [v setBordered:NO]; - + c = new wxNSTextFieldControl( wxpeer, v ); static_cast(c)->SetStringValue(str); } - + return c; }