virtual bool                isFlipped(WXWidget slf, void* _cmd);
     virtual void                drawRect(void* rect, WXWidget slf, void* _cmd);
     
-    virtual void                clickedAction(WXWidget slf, void* _cmd, void* sender);
-    virtual void                doubleClickedAction(WXWidget slf, void* _cmd, void *sender);
+    virtual void                controlAction(WXWidget slf, void* _cmd, void* sender);
+    virtual void                controlDoubleAction(WXWidget slf, void* _cmd, void *sender);
 
 protected:
     WXWidget m_osxView;
 
     virtual void GetSelection( long* from, long* to) const ;
     virtual void SetSelection( long from , long to );
     virtual void WriteText(const wxString& str) ;
+    
+    virtual void controlAction(WXWidget slf, void* _cmd, void *sender);
+protected :
+    NSTextField* m_textField;
 };
 
 #endif // _WX_OSX_COCOA_PRIVATE_TEXTIMPL_H_
 
     virtual void            UpdateLine( unsigned int n, wxListWidgetColumn* col = NULL ) ;
     virtual void            UpdateLineToEnd( unsigned int n);
 
-    virtual void            clickedAction(WXWidget slf, void* _cmd, void *sender);
-    virtual void            doubleClickedAction(void* _cmd);
+    virtual void            controlAction(WXWidget slf, void* _cmd, void *sender);
+    virtual void            controlDoubleAction(void* _cmd);
 protected :
     wxNSTableView*          m_tableView ;
     
     {
         [col1 setMaxWidth:defaultWidth];
         [col1 setMinWidth:defaultWidth];
+        [col1 setWidth:defaultWidth];
     }
-    
+    else
+    {
+        [col1 setMaxWidth:1000];        
+        [col1 setMinWidth:10];
+        // temporary hack, because I cannot get the automatic column resizing
+        // to work properly
+        [col1 setWidth:1000];
+    }
+    [col1 setResizingMask: NSTableColumnAutoresizingMask];
     wxCocoaTableColumn* wxcol = new wxCocoaTableColumn( col1, editable );
     [col1 setColumn:wxcol];
 
     {
         [col1 setMaxWidth:defaultWidth];
         [col1 setMinWidth:defaultWidth];
+        [col1 setWidth:defaultWidth];
     }
     
+    [col1 setResizingMask: NSTableColumnNoResizing];
     wxCocoaTableColumn* wxcol = new wxCocoaTableColumn( col1, editable );
     [col1 setColumn:wxcol];
 
     [m_tableView reloadData];
 }
 
-void wxListWidgetCocoaImpl::clickedAction(WXWidget slf,void* _cmd, void *sender)
+void wxListWidgetCocoaImpl::controlAction(WXWidget slf,void* _cmd, void *sender)
 {
     wxListBox *list = static_cast<wxListBox*> ( GetWXPeer());
     wxCHECK_RET( list != NULL , wxT("Listbox expected"));
     list->HandleLineEvent( sel, false );
 }
 
-void wxListWidgetCocoaImpl::doubleClickedAction(void* _cmd)
+void wxListWidgetCocoaImpl::controlDoubleAction(void* _cmd)
 {
     wxListBox *list = static_cast<wxListBox*> ( GetWXPeer());
     wxCHECK_RET( list != NULL , wxT("Listbox expected"));
         [scrollview setHasHorizontalScroller:YES];
     
     [scrollview setAutohidesScrollers: ((style & wxLB_ALWAYS_SB) ? NO : YES)];
-    
+
     // setting up the true table
     
     wxNSTableView* tableview = [[wxNSTableView alloc] init];
-    [scrollview setDocumentView:tableview];
-    [tableview release];
-    
     // only one multi-select mode available
     if ( (style & wxLB_EXTENDED) || (style & wxLB_MULTIPLE) )
         [tableview setAllowsMultipleSelection:YES];
     // simple listboxes have no header row
     [tableview setHeaderView:nil];
     
-    [tableview setColumnAutoresizingStyle:NSTableViewLastColumnOnlyAutoresizingStyle];
+    if ( style & wxLB_HSCROLL )
+        [tableview setColumnAutoresizingStyle:NSTableViewNoColumnAutoresizing];
+    else
+        [tableview setColumnAutoresizingStyle:NSTableViewLastColumnOnlyAutoresizingStyle];
+        
     wxNSTableDataSource* ds = [[ wxNSTableDataSource alloc] init];
     [tableview setDataSource:ds];
+    [scrollview setDocumentView:tableview];
+    [tableview release];
+
     wxListWidgetCocoaImpl* c = new wxListWidgetCocoaImpl( wxpeer, scrollview, tableview, ds );
 
     // temporary hook for dnd
 
         return m_maximum;
     }
 
-    virtual void clickedAction(WXWidget slf, void* _cmd, void *sender);
+    virtual void controlAction(WXWidget slf, void* _cmd, void *sender);
     virtual void mouseEvent(WX_NSEvent event, WXWidget slf, void* _cmd);
 protected:
     wxInt32 m_maximum;
 // to thumbtrack and only after super mouseDown 
 // returns we will call the thumbrelease
 
-void wxOSXScrollBarCocoaImpl::clickedAction( WXWidget slf, void *_cmd, void *sender)
+void wxOSXScrollBarCocoaImpl::controlAction( WXWidget slf, void *_cmd, void *sender)
 {
     wxEventType scrollEvent = wxEVT_NULL;
     switch ([(NSScroller*)m_osxView hitPart]) 
 
     {
     }
 
-    virtual void clickedAction(WXWidget slf, void* _cmd, void *sender);
+    virtual void controlAction(WXWidget slf, void* _cmd, void *sender);
     virtual void mouseEvent(WX_NSEvent event, WXWidget slf, void* _cmd);
 };
 
 // to thumbtrack and only after super mouseDown 
 // returns we will call the thumbrelease
 
-void wxSliderCocoaImpl::clickedAction( WXWidget slf, void *_cmd, void *sender)
+void wxSliderCocoaImpl::controlAction( WXWidget slf, void *_cmd, void *sender)
 {
     wxWindow* wxpeer = (wxWindow*) GetWXPeer();
     if ( wxpeer )
 
     {
     }
 
-    virtual void clickedAction(WXWidget slf, void* _cmd, void *sender);
+    virtual void controlAction(WXWidget slf, void* _cmd, void *sender);
     virtual void mouseEvent(WX_NSEvent event, WXWidget slf, void* _cmd);
 private:
     int m_formerValue;
     wxWidgetCocoaImpl::mouseEvent(event, slf, _cmd);
 }
 
-void wxSpinButtonCocoaImpl::clickedAction( WXWidget slf, void *_cmd, void *sender)
+void wxSpinButtonCocoaImpl::controlAction( WXWidget slf, void *_cmd, void *sender)
 {
     wxWindow* wxpeer = (wxWindow*) GetWXPeer();
     if ( wxpeer )
 
     return self;
 }
 
-// use our common calls
-- (void) setTitle:(NSString *) title
-{
-    [self setStringValue: title];
-}
-
 - (void) searchAction: (id) sender
 {
     wxWidgetCocoaImpl* impl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( self );
 
 #include "wx/osx/private.h"
 #include "wx/osx/cocoa/private/textimpl.h"
 
-@implementation wxNSTextField
+@interface wxNSSecureTextField : NSSecureTextField
+
+@end
+
+@implementation wxNSSecureTextField 
 
 + (void)initialize
 {
     }
 }
 
-- (id)initWithFrame:(NSRect)frame
-{
-    [super initWithFrame:frame];
-    [self setDelegate: self];
-    [self setTarget: self];
-//    [self setAction: @selector(enterAction:)];
-    return self;
-}
+@end
+
+@implementation wxNSTextField
 
-// use our common calls
-- (void) setTitle:(NSString *) title
++ (void)initialize
 {
-    [self setStringValue: title];
+    static BOOL initialized = NO;
+    if (!initialized) 
+    {
+        initialized = YES;
+        wxOSXCocoaClassAddWXMethods( self );
+    }
 }
+
 /*
 - (void)controlTextDidChange:(NSNotification *)aNotification
 {
         }
     }
 }
-
-- (void) enterAction: (id) sender
-{
-    if ( impl )
-    {
-        wxWindow* wxpeer = (wxWindow*) impl->GetWXPeer();
-        if ( wxpeer && (wxpeer->GetWindowStyle() & wxTE_PROCESS_ENTER) ) {
-            wxCommandEvent event(wxEVT_COMMAND_TEXT_ENTER, wxpeer->GetId());
-            event.SetEventObject( wxpeer );
-            event.SetString( static_cast<wxTextCtrl*>(wxpeer)->GetValue() );
-            wxpeer->HandleWindowEvent( event );
-        }
-    }
-}
 */
 @end
 
 wxNSTextFieldControl::wxNSTextFieldControl( wxTextCtrl *wxPeer, WXWidget w ) : wxWidgetCocoaImpl(wxPeer, w)
 {
+    m_textField = (NSTextField*) w;
+    [m_textField setDelegate: w];
 }
 
 wxNSTextFieldControl::~wxNSTextFieldControl()
 
 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) 
     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<wxTextCtrl*>(wxpeer)->GetValue() );
+        wxpeer->HandleWindowEvent( event );
+    }
+}
+
+//
+//
+//
+
 wxWidgetImplType* wxWidgetImpl::CreateTextControl( wxTextCtrl* wxpeer, 
                                     wxWindowMac* parent, 
                                     wxWindowID id, 
                                     long extraStyle)
 {
     NSRect r = wxOSXGetFrameForControl( wxpeer, pos , size ) ;
-    wxNSTextField* v = [[wxNSTextField alloc] initWithFrame:r];
+    NSTextField* v = nil;
+    
+    if ( style & wxTE_PASSWORD )
+        v =[[wxNSSecureTextField alloc] initWithFrame:r];    
+    else
+        v= [[wxNSTextField alloc] initWithFrame:r];
     
     if ( style & wxNO_BORDER )
     {
         [v setBordered:NO];
     }
 
+    [v setBezeled:NO];
+    [v setBordered:NO];
     //[v setBezeled:NO];
     //[v setEditable:NO];
     //[v setDrawsBackground:NO];
 
      case NSScrollWheel :
         {
             wxevent.SetEventType( wxEVT_MOUSEWHEEL ) ;
-            wxevent.m_wheelDelta = 1;
+            wxevent.m_wheelDelta = 10;
             wxevent.m_linesPerAction = 1;
+            NSLog(@"deltaX %f, deltaY %f",[nsEvent deltaX], [nsEvent deltaY]);
             if ( abs([nsEvent deltaX]) > abs([nsEvent deltaY]) )
             {
                 wxevent.m_wheelAxis = 1;
-                wxevent.m_wheelRotation = [nsEvent deltaX] > 0.0 ? 1 : -1;
+                wxevent.m_wheelRotation = [nsEvent deltaX] * 10.0;
             }
             else
             {
-                wxevent.m_wheelRotation = [nsEvent deltaY] > 0.0 ? 1 : -1;
+                wxevent.m_wheelRotation = [nsEvent deltaY] * 10.0;
             }
         }
         break ;
     return impl->drawRect(&rect, self, _cmd);
 }
 
-void wxOSX_clickedAction(NSView* self, SEL _cmd, id sender)
+void wxOSX_controlAction(NSView* self, SEL _cmd, id sender)
 {
     wxWidgetCocoaImpl* impl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( self );
     if (impl == NULL)
         return;
         
-    impl->clickedAction(self, _cmd, sender);
+    impl->controlAction(self, _cmd, sender);
 }
 
-void wxOSX_doubleClickedAction(NSView* self, SEL _cmd, id sender)
+void wxOSX_controlDoubleAction(NSView* self, SEL _cmd, id sender)
 {
     wxWidgetCocoaImpl* impl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( self );
     if (impl == NULL)
         return;
         
-    impl->doubleClickedAction(self, _cmd, sender);
+    impl->controlDoubleAction(self, _cmd, sender);
 }
 
 unsigned int wxWidgetCocoaImpl::draggingEntered(void* s, WXWidget slf, void *_cmd)
     CGContextRestoreGState( context );
 }
 
-void wxWidgetCocoaImpl::clickedAction( WXWidget slf, void *_cmd, void *sender)
+void wxWidgetCocoaImpl::controlAction( WXWidget slf, void *_cmd, void *sender)
 {
     wxWindow* wxpeer = (wxWindow*) GetWXPeer();
     if ( wxpeer )
         wxpeer->OSXHandleClicked(0);
 }
 
-void wxWidgetCocoaImpl::doubleClickedAction( WXWidget slf, void *_cmd, void *sender)
+void wxWidgetCocoaImpl::controlDoubleAction( WXWidget slf, void *_cmd, void *sender)
 {
 }
 
     wxOSX_CLASS_ADD_METHOD(c, @selector(isFlipped), (IMP) wxOSX_isFlipped, "c@:" )
     wxOSX_CLASS_ADD_METHOD(c, @selector(drawRect:), (IMP) wxOSX_drawRect, "v@:{_NSRect={_NSPoint=ff}{_NSSize=ff}}" )
 
-    wxOSX_CLASS_ADD_METHOD(c, @selector(clickedAction:), (IMP) wxOSX_clickedAction, "v@:@" )
-    wxOSX_CLASS_ADD_METHOD(c, @selector(doubleClickedAction:), (IMP) wxOSX_doubleClickedAction, "v@:@" )
+    wxOSX_CLASS_ADD_METHOD(c, @selector(controlAction:), (IMP) wxOSX_controlAction, "v@:@" )
+    wxOSX_CLASS_ADD_METHOD(c, @selector(controlDoubleAction:), (IMP) wxOSX_controlDoubleAction, "v@:@" )
 
 #if wxUSE_DRAG_AND_DROP
     wxOSX_CLASS_ADD_METHOD(c, @selector(draggingEntered:), (IMP) wxOSX_draggingEntered, "I@:@" )
         wxCFStringRef cf( title , m_wxPeer->GetFont().GetEncoding() );
         [m_osxView setTitle:cf.AsNSString()];
     }
+    else if ( [m_osxView respondsToSelector:@selector(setStringValue:) ] )
+    {
+        wxCFStringRef cf( title , m_wxPeer->GetFont().GetEncoding() );
+        [m_osxView setStringValue:cf.AsNSString()];
+    }
 }
     
 
     if ([c respondsToSelector:@selector(setAction:)])
     {
         [c setTarget: c];
-        [c setAction: @selector(clickedAction:)];
+        [c setAction: @selector(controlAction:)];
         if ([c respondsToSelector:@selector(setDoubleAction:)])
         {
-            [c setDoubleAction: @selector(doubleClickedAction:)];
+            [c setDoubleAction: @selector(controlDoubleAction:)];
         }
         
     }