X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0c530e5a6790a1789d8f857eb0c1d49b743833cd..f8d0234d39c66f3d1d7fc2346562cb96c8c7be20:/src/osx/cocoa/textctrl.mm diff --git a/src/osx/cocoa/textctrl.mm b/src/osx/cocoa/textctrl.mm index 3e5b8d87e7..f4debced6c 100644 --- a/src/osx/cocoa/textctrl.mm +++ b/src/osx/cocoa/textctrl.mm @@ -49,26 +49,37 @@ #include "wx/osx/private.h" #include "wx/osx/cocoa/private/textimpl.h" -@implementation wxNSTextField +@interface wxNSSecureTextField : NSSecureTextField +{ + wxWidgetCocoaImpl* impl; +} + +- (void) setImplementation:(wxWidgetCocoaImpl*) item; +- (wxWidgetCocoaImpl*) implementation; +@end -WXCOCOAIMPL_COMMON_IMPLEMENTATION +@implementation wxNSSecureTextField -- (id)initWithFrame:(NSRect)frame ++ (void)initialize { - [super initWithFrame:frame]; - impl = NULL; - [self setDelegate: self]; - [self setTarget: self]; -// [self setAction: @selector(enterAction:)]; - return self; + static BOOL initialized = NO; + if (!initialized) + { + initialized = YES; + wxOSXCocoaClassAddWXMethods( self ); + } } -// use our common calls -- (void) setTitle:(NSString *) title +- (wxWidgetCocoaImpl*) implementation { - [self setStringValue: title]; + return impl; } -/* + +- (void) setImplementation:(wxWidgetCocoaImpl*) item +{ + impl = item; +} + - (void)controlTextDidChange:(NSNotification *)aNotification { if ( impl ) @@ -83,81 +94,297 @@ WXCOCOAIMPL_COMMON_IMPLEMENTATION } } -- (void)controlTextDidEndEditing:(NSNotification *)aNotification +@end + +@interface wxNSTextView : NSScrollView +{ + wxWidgetCocoaImpl* impl; +} + +- (void) setImplementation:(wxWidgetCocoaImpl*) item; +- (wxWidgetCocoaImpl*) implementation; +@end + +@implementation wxNSTextView + ++ (void)initialize +{ + static BOOL initialized = NO; + if (!initialized) + { + initialized = YES; + wxOSXCocoaClassAddWXMethods( self ); + } +} + +- (wxWidgetCocoaImpl*) implementation +{ + return impl; +} + +- (void) setImplementation:(wxWidgetCocoaImpl*) item +{ + impl = item; +} + + +- (void)controlTextDidChange:(NSNotification *)aNotification { if ( impl ) { wxWindow* wxpeer = (wxWindow*) impl->GetWXPeer(); if ( wxpeer ) { - wxFocusEvent event(wxEVT_KILL_FOCUS, wxpeer->GetId()); + wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, wxpeer->GetId()); event.SetEventObject( wxpeer ); - event.SetWindow( wxpeer ); + event.SetString( static_cast(wxpeer)->GetValue() ); wxpeer->HandleWindowEvent( event ); } } } +@end + +@implementation wxNSTextField + ++ (void)initialize +{ + static BOOL initialized = NO; + if (!initialized) + { + initialized = YES; + wxOSXCocoaClassAddWXMethods( self ); + } +} + +- (wxWidgetCocoaImpl*) implementation +{ + return impl; +} + +- (void) setImplementation:(wxWidgetCocoaImpl*) item +{ + impl = item; +} + +- (void) setEnabled:(BOOL) flag +{ + [super setEnabled: flag]; + + if (![self drawsBackground]) { + // Static text is drawn incorrectly when disabled. + // For an explanation, see + // http://www.cocoabuilder.com/archive/message/cocoa/2006/7/21/168028 + if (flag) { + [self setTextColor: [NSColor controlTextColor]]; + } else { + [self setTextColor: [NSColor secondarySelectedControlColor]]; + } + } +} -- (void) enterAction: (id) sender +- (void)controlTextDidChange:(NSNotification *)aNotification { if ( impl ) { wxWindow* wxpeer = (wxWindow*) impl->GetWXPeer(); - if ( wxpeer && (wxpeer->GetWindowStyle() & wxTE_PROCESS_ENTER) ) { - wxCommandEvent event(wxEVT_COMMAND_TEXT_ENTER, wxpeer->GetId()); + if ( wxpeer ) { + wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, wxpeer->GetId()); event.SetEventObject( wxpeer ); event.SetString( static_cast(wxpeer)->GetValue() ); wxpeer->HandleWindowEvent( event ); } } } + +/* +- (void)controlTextDidEndEditing:(NSNotification *)aNotification +{ + if ( impl ) + { + wxWindow* wxpeer = (wxWindow*) impl->GetWXPeer(); + if ( wxpeer ) { + wxFocusEvent event(wxEVT_KILL_FOCUS, wxpeer->GetId()); + event.SetEventObject( wxpeer ); + event.SetWindow( wxpeer ); + wxpeer->HandleWindowEvent( event ); + } + } +} */ @end +// wxNSTextViewControl + +wxNSTextViewControl::wxNSTextViewControl( wxTextCtrl *wxPeer, WXWidget w ) : wxWidgetCocoaImpl(wxPeer, w) +{ + m_scrollView = (NSScrollView*) w; + [w setImplementation: this]; + + [m_scrollView setHasVerticalScroller:YES]; + [m_scrollView setHasHorizontalScroller:NO]; + [m_scrollView setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable]; + NSSize contentSize = [m_scrollView contentSize]; + + m_textView = [[NSTextView alloc] initWithFrame: NSMakeRect(0, 0, + contentSize.width, contentSize.height)]; + [m_textView setVerticallyResizable:YES]; + [m_textView setHorizontallyResizable:NO]; + [m_textView setAutoresizingMask:NSViewWidthSizable]; + + [m_scrollView setDocumentView: m_textView]; + + [m_textView setDelegate: w]; +} + +wxNSTextViewControl::~wxNSTextViewControl() +{ + if (m_textView) + [m_textView setDelegate: nil]; +} + +wxString wxNSTextViewControl::GetStringValue() const +{ + if (m_textView) + { + wxCFStringRef cf( (CFStringRef) [[m_textView string] retain] ); + return cf.AsString(m_wxPeer->GetFont().GetEncoding()); + } + return wxEmptyString; +} +void wxNSTextViewControl::SetStringValue( const wxString &str) +{ + if (m_textView) + [m_textView setString: wxCFStringRef( str , m_wxPeer->GetFont().GetEncoding() ).AsNSString()]; +} +void wxNSTextViewControl::Copy() +{ + if (m_textView) + [m_textView copy:nil]; + +} + +void wxNSTextViewControl::Cut() +{ + if (m_textView) + [m_textView cut:nil]; +} + +void wxNSTextViewControl::Paste() +{ + if (m_textView) + [m_textView paste:nil]; +} + +bool wxNSTextViewControl::CanPaste() const +{ + return true; +} + +void wxNSTextViewControl::SetEditable(bool editable) +{ + if (m_textView) + [m_textView setEditable: editable]; +} + +void wxNSTextViewControl::GetSelection( long* from, long* to) const +{ + if (m_textView) + { + NSRange range = [m_textView selectedRange]; + *from = range.location; + *to = range.location + range.length; + } +} + +void wxNSTextViewControl::SetSelection( long from , long to ) +{ + [m_textView setSelectedRange:NSMakeRange(from, to-from)]; +} + +void wxNSTextViewControl::WriteText(const wxString& str) +{ + // temp hack to get logging working early + wxString former = GetStringValue(); + SetStringValue( former + str ); +} + +// wxNSTextFieldControl + wxNSTextFieldControl::wxNSTextFieldControl( wxTextCtrl *wxPeer, WXWidget w ) : wxWidgetCocoaImpl(wxPeer, w) { + m_textField = (NSTextField*) w; + [m_textField setDelegate: w]; } wxNSTextFieldControl::~wxNSTextFieldControl() { + if (m_textField) + [m_textField setDelegate: nil]; } wxString wxNSTextFieldControl::GetStringValue() const { - wxCFStringRef cf( (CFStringRef) [[(wxNSTextField*) m_osxView stringValue] retain] ); + wxCFStringRef cf( (CFStringRef) [[m_textField stringValue] retain] ); return cf.AsString(m_wxPeer->GetFont().GetEncoding()); } void wxNSTextFieldControl::SetStringValue( const wxString &str) { - [(wxNSTextField*) m_osxView setStringValue: wxCFStringRef( str , m_wxPeer->GetFont().GetEncoding() ).AsNSString()]; + [m_textField setStringValue: wxCFStringRef( str , m_wxPeer->GetFont().GetEncoding() ).AsNSString()]; } void wxNSTextFieldControl::Copy() { + NSText* editor = [m_textField currentEditor]; + if ( editor ) + { + [editor copy:nil]; + } } void wxNSTextFieldControl::Cut() { + NSText* editor = [m_textField currentEditor]; + if ( editor ) + { + [editor cut:nil]; + } } void wxNSTextFieldControl::Paste() { + NSText* editor = [m_textField currentEditor]; + if ( editor ) + { + [editor paste:nil]; + } } bool wxNSTextFieldControl::CanPaste() const { - return false; + return true; } void wxNSTextFieldControl::SetEditable(bool editable) { - [(wxNSTextField*) m_osxView setEditable:editable]; + [m_textField setEditable:editable]; } void wxNSTextFieldControl::GetSelection( long* from, long* to) const { + NSText* editor = [m_textField currentEditor]; + if ( editor ) + { + NSRange range = [editor selectedRange]; + *from = range.location; + *to = range.location + range.length; + } } void wxNSTextFieldControl::SetSelection( long from , long to ) { + NSText* editor = [m_textField currentEditor]; + if ( editor ) + { + [editor setSelectedRange:NSMakeRange(from, to-from)]; + } } void wxNSTextFieldControl::WriteText(const wxString& str) @@ -167,6 +394,22 @@ void wxNSTextFieldControl::WriteText(const wxString& str) SetStringValue( former + str ); } +void wxNSTextFieldControl::controlAction(WXWidget slf, void* _cmd, void *sender) +{ + wxWindow* wxpeer = (wxWindow*) GetWXPeer(); + 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 ); + } +} + +// +// +// + wxWidgetImplType* wxWidgetImpl::CreateTextControl( wxTextCtrl* wxpeer, wxWindowMac* parent, wxWindowID id, @@ -177,20 +420,36 @@ wxWidgetImplType* wxWidgetImpl::CreateTextControl( wxTextCtrl* wxpeer, long extraStyle) { NSRect r = wxOSXGetFrameForControl( wxpeer, pos , size ) ; - wxNSTextField* v = [[wxNSTextField alloc] initWithFrame:r]; + NSTextField* v = nil; + wxWidgetCocoaImpl* c = NULL; - if ( style & wxNO_BORDER ) + if ( style & wxTE_MULTILINE || style & wxTE_RICH || style & wxTE_RICH2 ) { + v = [[wxNSTextView alloc] initWithFrame:r]; + c = new wxNSTextViewControl( wxpeer, v ); + static_cast(c)->SetStringValue(str); + } + else + { + 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 ); + [v setImplementation: c]; + static_cast(c)->SetStringValue(str); } - - //[v setBezeled:NO]; - //[v setEditable:NO]; - //[v setDrawsBackground:NO]; - wxWidgetCocoaImpl* c = new wxNSTextFieldControl( wxpeer, v ); - [v setImplementation:c]; return c; }