+@interface NSView(EditableView)
+- (BOOL)isEditable;
+- (void)setEditable:(BOOL)flag;
+- (BOOL)isSelectable;
+- (void)setSelectable:(BOOL)flag;
+@end
+
+class wxMacEditHelper
+{
+public :
+ wxMacEditHelper( NSView* textView )
+ {
+ m_textView = textView;
+ m_formerEditable = YES;
+ if ( textView )
+ {
+ m_formerEditable = [textView isEditable];
+ m_formerSelectable = [textView isSelectable];
+ [textView setEditable:YES];
+ }
+ }
+
+ ~wxMacEditHelper()
+ {
+ if ( m_textView )
+ {
+ [m_textView setEditable:m_formerEditable];
+ [m_textView setSelectable:m_formerSelectable];
+ }
+ }
+
+protected :
+ BOOL m_formerEditable ;
+ BOOL m_formerSelectable;
+ NSView* m_textView;
+} ;
+
+@implementation wxNSSecureTextField
+
++ (void)initialize
+{
+ static BOOL initialized = NO;
+ if (!initialized)
+ {
+ initialized = YES;
+ wxOSXCocoaClassAddWXMethods( self );
+ }
+}
+
+- (void)controlTextDidChange:(NSNotification *)aNotification
+{
+ wxUnusedVar(aNotification);
+ wxWidgetCocoaImpl* impl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( self );
+ if ( impl )
+ impl->controlTextDidChange();
+}
+
+- (void)controlTextDidEndEditing:(NSNotification *)aNotification
+{
+ wxUnusedVar(aNotification);
+ wxWidgetCocoaImpl* impl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( self );
+ if ( impl )
+ {
+ impl->DoNotifyFocusEvent( false, NULL );
+ }
+}
+
+@end
+
+@interface wxNSTextScrollView : NSScrollView
+{
+}
+@end
+
+@implementation wxNSTextScrollView
+
++ (void)initialize
+{
+ static BOOL initialized = NO;
+ if (!initialized)
+ {
+ initialized = YES;
+ wxOSXCocoaClassAddWXMethods( self );
+ }
+}
+
+@end
+
+@implementation wxNSTextFieldEditor
+
+- (void) keyDown:(NSEvent*) event
+{
+ wxWidgetCocoaImpl* impl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( (WXWidget) [self delegate] );
+ lastKeyDownEvent = event;
+ if ( impl == NULL || !impl->DoHandleKeyEvent(event) )
+ [super keyDown:event];
+ lastKeyDownEvent = nil;
+}
+
+- (void) keyUp:(NSEvent*) event
+{
+ wxWidgetCocoaImpl* impl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( (WXWidget) [self delegate] );
+ if ( impl == NULL || !impl->DoHandleKeyEvent(event) )
+ [super keyUp:event];
+}
+
+- (void) flagsChanged:(NSEvent*) event
+{
+ wxWidgetCocoaImpl* impl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( (WXWidget) [self delegate] );
+ if ( impl == NULL || !impl->DoHandleKeyEvent(event) )
+ [super flagsChanged:event];
+}
+
+- (BOOL) performKeyEquivalent:(NSEvent*) event
+{
+ BOOL retval = [super performKeyEquivalent:event];
+ return retval;
+}
+
+- (void) insertText:(id) str
+{
+ wxWidgetCocoaImpl* impl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( (WXWidget) [self delegate] );
+ if ( impl == NULL || lastKeyDownEvent==nil || !impl->DoHandleCharEvent(lastKeyDownEvent, str) )
+ {
+ [super insertText:str];
+ }
+}
+
+@end
+
+@implementation wxNSTextView
+
++ (void)initialize
+{
+ static BOOL initialized = NO;
+ if (!initialized)
+ {
+ initialized = YES;
+ wxOSXCocoaClassAddWXMethods( self );
+ }
+}
+
+- (void)textDidChange:(NSNotification *)aNotification
+{
+ wxUnusedVar(aNotification);
+ wxWidgetCocoaImpl* impl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( self );
+ if ( impl )
+ impl->controlTextDidChange();
+}
+
+- (void) setEnabled:(BOOL) flag
+{
+ // from Technical Q&A QA1461
+ if (flag) {
+ [self setTextColor: [NSColor controlTextColor]];
+
+ } else {
+ [self setTextColor: [NSColor disabledControlTextColor]];
+ }
+
+ [self setSelectable: flag];
+ [self setEditable: flag];
+}
+
+- (BOOL) isEnabled
+{
+ return [self isEditable];
+}
+
+- (void)textDidEndEditing:(NSNotification *)aNotification
+{
+ wxUnusedVar(aNotification);
+ wxWidgetCocoaImpl* impl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( self );
+ if ( impl )
+ {
+ impl->DoNotifyFocusEvent( false, NULL );
+ }
+}
+
+@end
+