]> git.saurik.com Git - wxWidgets.git/blobdiff - src/osx/cocoa/listbox.mm
Use UTF-8 for all non-ASCII characters in the sources.
[wxWidgets.git] / src / osx / cocoa / listbox.mm
index 2d43f9827f261a1b63f059360e68827063cb9d6e..e517ba97af0b2a6f38da0c7d9c09e1882a0957ad 100644 (file)
@@ -14,6 +14,7 @@
 #if wxUSE_LISTBOX
 
 #include "wx/listbox.h"
 #if wxUSE_LISTBOX
 
 #include "wx/listbox.h"
+#include "wx/dnd.h"
 
 #ifndef WX_PRECOMP
     #include "wx/log.h"
 
 #ifndef WX_PRECOMP
     #include "wx/log.h"
@@ -37,14 +38,14 @@ class wxListWidgetCocoaImpl;
     wxListWidgetCocoaImpl* impl;
 }
 
     wxListWidgetCocoaImpl* impl;
 }
 
-- (id)tableView:(NSTableView *)aTableView 
-        objectValueForTableColumn:(NSTableColumn *)aTableColumn 
+- (id)tableView:(NSTableView *)aTableView
+        objectValueForTableColumn:(NSTableColumn *)aTableColumn
         row:(NSInteger)rowIndex;
 
         row:(NSInteger)rowIndex;
 
-- (id)tableView:(NSTableView *)aTableView 
-        setObjectValue:(NSTableColumn *)aTableColumn 
+- (void)tableView:(NSTableView *)aTableView
+        setObjectValue:(id)value forTableColumn:(NSTableColumn *)aTableColumn
         row:(NSInteger)rowIndex;
         row:(NSInteger)rowIndex;
-        
+
 - (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView;
 
 - (void)setImplementation: (wxListWidgetCocoaImpl *) theImplementation;
 - (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView;
 
 - (void)setImplementation: (wxListWidgetCocoaImpl *) theImplementation;
@@ -54,12 +55,8 @@ class wxListWidgetCocoaImpl;
 
 @interface wxNSTableView : NSTableView
 {
 
 @interface wxNSTableView : NSTableView
 {
-    wxListWidgetCocoaImpl* impl;
 }
 
 }
 
-- (void)setImplementation: (wxListWidgetCocoaImpl *) theImplementation;
-- (wxListWidgetCocoaImpl*) implementation;
-
 @end
 
 //
 @end
 
 //
@@ -82,19 +79,19 @@ class wxCocoaTableColumn;
 class WXDLLIMPEXP_CORE wxCocoaTableColumn : public wxListWidgetColumn
 {
 public :
 class WXDLLIMPEXP_CORE wxCocoaTableColumn : public wxListWidgetColumn
 {
 public :
-    wxCocoaTableColumn( wxNSTableColumn* column, bool editable ) 
+    wxCocoaTableColumn( wxNSTableColumn* column, bool editable )
         : m_column( column ), m_editable(editable)
     {
     }
         : m_column( column ), m_editable(editable)
     {
     }
-    
+
     ~wxCocoaTableColumn()
     {
     }
     ~wxCocoaTableColumn()
     {
     }
-    
+
     wxNSTableColumn* GetNSTableColumn() const { return m_column ; }
     wxNSTableColumn* GetNSTableColumn() const { return m_column ; }
-    
+
     bool IsEditable() const { return m_editable; }
     bool IsEditable() const { return m_editable; }
-    
+
 protected :
     wxNSTableColumn* m_column;
     bool m_editable;
 protected :
     wxNSTableColumn* m_column;
     bool m_editable;
@@ -106,31 +103,31 @@ class wxListWidgetCocoaImpl : public wxWidgetCocoaImpl, public wxListWidgetImpl
 {
 public :
     wxListWidgetCocoaImpl( wxWindowMac* peer, NSScrollView* view, wxNSTableView* tableview, wxNSTableDataSource* data );
 {
 public :
     wxListWidgetCocoaImpl( wxWindowMac* peer, NSScrollView* view, wxNSTableView* tableview, wxNSTableDataSource* data );
-    
+
     ~wxListWidgetCocoaImpl();
     ~wxListWidgetCocoaImpl();
-    
-    virtual wxListWidgetColumn*     InsertTextColumn( unsigned pos, const wxString& title, bool editable = false, 
+
+    virtual wxListWidgetColumn*     InsertTextColumn( unsigned pos, const wxString& title, bool editable = false,
                                 wxAlignment just = wxALIGN_LEFT , int defaultWidth = -1)  ;
                                 wxAlignment just = wxALIGN_LEFT , int defaultWidth = -1)  ;
-    virtual wxListWidgetColumn*     InsertCheckColumn( unsigned pos , const wxString& title, bool editable = false, 
+    virtual wxListWidgetColumn*     InsertCheckColumn( unsigned pos , const wxString& title, bool editable = false,
                                 wxAlignment just = wxALIGN_LEFT , int defaultWidth =  -1)  ;
                                 wxAlignment just = wxALIGN_LEFT , int defaultWidth =  -1)  ;
-    
+
     // add and remove
     // add and remove
-    
-    virtual void            ListDelete( unsigned int n ) ;    
+
+    virtual void            ListDelete( unsigned int n ) ;
     virtual void            ListInsert( unsigned int n ) ;
     virtual void            ListClear() ;
 
     // selecting
 
     virtual void            ListDeselectAll();
     virtual void            ListInsert( unsigned int n ) ;
     virtual void            ListClear() ;
 
     // selecting
 
     virtual void            ListDeselectAll();
-    
+
     virtual void            ListSetSelection( unsigned int n, bool select, bool multi ) ;
     virtual int             ListGetSelection() const ;
     virtual void            ListSetSelection( unsigned int n, bool select, bool multi ) ;
     virtual int             ListGetSelection() const ;
-    
+
     virtual int             ListGetSelections( wxArrayInt& aSelections ) const ;
     virtual int             ListGetSelections( wxArrayInt& aSelections ) const ;
-    
+
     virtual bool            ListIsSelected( unsigned int n ) const ;
     virtual bool            ListIsSelected( unsigned int n ) const ;
-    
+
     // display
 
     virtual void            ListScrollTo( unsigned int n ) ;
     // display
 
     virtual void            ListScrollTo( unsigned int n ) ;
@@ -138,16 +135,19 @@ public :
     // accessing content
 
     virtual unsigned int    ListGetCount() const ;
     // accessing content
 
     virtual unsigned int    ListGetCount() const ;
-    
+
     int                     ListGetColumnType( int col )
     {
         return col;
     }
     virtual void            UpdateLine( unsigned int n, wxListWidgetColumn* col = NULL ) ;
     virtual void            UpdateLineToEnd( unsigned int n);
     int                     ListGetColumnType( int col )
     {
         return col;
     }
     virtual void            UpdateLine( unsigned int n, wxListWidgetColumn* col = NULL ) ;
     virtual void            UpdateLineToEnd( unsigned int n);
+
+    virtual void            controlAction(WXWidget slf, void* _cmd, void *sender);
+    virtual void            controlDoubleAction(WXWidget slf, void* _cmd, void *sender);
 protected :
     wxNSTableView*          m_tableView ;
 protected :
     wxNSTableView*          m_tableView ;
-    
+
     wxNSTableDataSource*    m_dataSource;
 } ;
 
     wxNSTableDataSource*    m_dataSource;
 } ;
 
@@ -182,38 +182,38 @@ public :
     wxNSTableViewCellValue( id &v ) : value(v)
     {
     }
     wxNSTableViewCellValue( id &v ) : value(v)
     {
     }
-    
+
     virtual ~wxNSTableViewCellValue() {}
 
     virtual void Set( CFStringRef v )
     {
         value = [[(NSString*)v retain] autorelease];
     }
     virtual ~wxNSTableViewCellValue() {}
 
     virtual void Set( CFStringRef v )
     {
         value = [[(NSString*)v retain] autorelease];
     }
-    virtual void Set( const wxString& value ) 
+    virtual void Set( const wxString& value )
     {
         Set( (CFStringRef) wxCFStringRef( value ) );
     }
     {
         Set( (CFStringRef) wxCFStringRef( value ) );
     }
-    virtual void Set( int v ) 
+    virtual void Set( int v )
     {
         value = [NSNumber numberWithInt:v];
     }
     {
         value = [NSNumber numberWithInt:v];
     }
-    
-    virtual int GetIntValue() const 
+
+    virtual int GetIntValue() const
     {
         if ( [value isKindOfClass:[NSNumber class]] )
             return [ (NSNumber*) value intValue ];
     {
         if ( [value isKindOfClass:[NSNumber class]] )
             return [ (NSNumber*) value intValue ];
-            
+
         return 0;
     }
         return 0;
     }
-    
-    virtual wxString GetStringValue() const 
+
+    virtual wxString GetStringValue() const
     {
         if ( [value isKindOfClass:[NSString class]] )
     {
         if ( [value isKindOfClass:[NSString class]] )
-            return wxCFStringRef( (CFStringRef) [value retain] ).AsString();
-            
+            return wxCFStringRef::AsString( (NSString*) value );
+
         return wxEmptyString;
     }
         return wxEmptyString;
     }
-        
+
 protected:
     id& value;
 } ;
 protected:
     id& value;
 } ;
@@ -239,15 +239,17 @@ protected:
 
 - (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView
 {
 
 - (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView
 {
+    wxUnusedVar(aTableView);
     if ( impl )
         return impl->ListGetCount();
     return 0;
 }
 
     if ( impl )
         return impl->ListGetCount();
     return 0;
 }
 
-- (id)tableView:(NSTableView *)aTableView 
-        objectValueForTableColumn:(NSTableColumn *)aTableColumn 
+- (id)tableView:(NSTableView *)aTableView
+        objectValueForTableColumn:(NSTableColumn *)aTableColumn
         row:(NSInteger)rowIndex
 {
         row:(NSInteger)rowIndex
 {
+    wxUnusedVar(aTableView);
     wxNSTableColumn* tablecol = (wxNSTableColumn *)aTableColumn;
     wxListBox* lb = dynamic_cast<wxListBox*>(impl->GetWXPeer());
     wxCocoaTableColumn* col = [tablecol column];
     wxNSTableColumn* tablecol = (wxNSTableColumn *)aTableColumn;
     wxListBox* lb = dynamic_cast<wxListBox*>(impl->GetWXPeer());
     wxCocoaTableColumn* col = [tablecol column];
@@ -257,10 +259,11 @@ protected:
     return value;
 }
 
     return value;
 }
 
-- (void)tableView:(NSTableView *)aTableView 
-        setObjectValue:(id)value forTableColumn:(NSTableColumn *)aTableColumn 
+- (void)tableView:(NSTableView *)aTableView
+        setObjectValue:(id)value forTableColumn:(NSTableColumn *)aTableColumn
         row:(NSInteger)rowIndex
 {
         row:(NSInteger)rowIndex
 {
+    wxUnusedVar(aTableView);
     wxNSTableColumn* tablecol = (wxNSTableColumn *)aTableColumn;
     wxListBox* lb = dynamic_cast<wxListBox*>(impl->GetWXPeer());
     wxCocoaTableColumn* col = [tablecol column];
     wxNSTableColumn* tablecol = (wxNSTableColumn *)aTableColumn;
     wxListBox* lb = dynamic_cast<wxListBox*>(impl->GetWXPeer());
     wxCocoaTableColumn* col = [tablecol column];
@@ -272,17 +275,16 @@ protected:
 
 @implementation wxNSTableView
 
 
 @implementation wxNSTableView
 
-- (void)setImplementation: (wxListWidgetCocoaImpl *) theImplementation
++ (void)initialize
 {
 {
-    impl = theImplementation;
-}
-
-- (wxListWidgetCocoaImpl*) implementation
-{
-    return impl;
+    static BOOL initialized = NO;
+    if (!initialized)
+    {
+        initialized = YES;
+        wxOSXCocoaClassAddWXMethods( self );
+    }
 }
 
 }
 
-
 @end
 
 //
 @end
 
 //
@@ -292,6 +294,7 @@ protected:
 wxListWidgetCocoaImpl::wxListWidgetCocoaImpl( wxWindowMac* peer, NSScrollView* view, wxNSTableView* tableview, wxNSTableDataSource* data ) :
     wxWidgetCocoaImpl( peer, view ), m_tableView(tableview), m_dataSource(data)
 {
 wxListWidgetCocoaImpl::wxListWidgetCocoaImpl( wxWindowMac* peer, NSScrollView* view, wxNSTableView* tableview, wxNSTableDataSource* data ) :
     wxWidgetCocoaImpl( peer, view ), m_tableView(tableview), m_dataSource(data)
 {
+    InstallEventHandler( tableview );
 }
 
 wxListWidgetCocoaImpl::~wxListWidgetCocoaImpl()
 }
 
 wxListWidgetCocoaImpl::~wxListWidgetCocoaImpl()
@@ -299,7 +302,7 @@ wxListWidgetCocoaImpl::~wxListWidgetCocoaImpl()
     [m_dataSource release];
 }
 
     [m_dataSource release];
 }
 
-unsigned int wxListWidgetCocoaImpl::ListGetCount() const 
+unsigned int wxListWidgetCocoaImpl::ListGetCount() const
 {
     wxListBox* lb = dynamic_cast<wxListBox*> ( GetWXPeer() );
     return lb->GetCount();
 {
     wxListBox* lb = dynamic_cast<wxListBox*> ( GetWXPeer() );
     return lb->GetCount();
@@ -309,25 +312,34 @@ unsigned int wxListWidgetCocoaImpl::ListGetCount() const
 // columns
 //
 
 // columns
 //
 
-wxListWidgetColumn* wxListWidgetCocoaImpl::InsertTextColumn( unsigned pos, const wxString& title, bool editable, 
-                                wxAlignment just, int defaultWidth) 
+wxListWidgetColumn* wxListWidgetCocoaImpl::InsertTextColumn( unsigned pos, const wxString& WXUNUSED(title), bool editable,
+                                wxAlignment WXUNUSED(just), int defaultWidth)
 {
     wxNSTableColumn* col1 = [[wxNSTableColumn alloc] init];
     [col1 setEditable:editable];
 {
     wxNSTableColumn* col1 = [[wxNSTableColumn alloc] init];
     [col1 setEditable:editable];
-    
+
     unsigned formerColCount = [m_tableView numberOfColumns];
     unsigned formerColCount = [m_tableView numberOfColumns];
-    
+
     // there's apparently no way to insert at a specific position
     [m_tableView addTableColumn:col1 ];
     if ( pos < formerColCount )
         [m_tableView moveColumn:formerColCount toColumn:pos];
     // there's apparently no way to insert at a specific position
     [m_tableView addTableColumn:col1 ];
     if ( pos < formerColCount )
         [m_tableView moveColumn:formerColCount toColumn:pos];
-        
+
     if ( defaultWidth >= 0 )
     {
         [col1 setMaxWidth:defaultWidth];
         [col1 setMinWidth:defaultWidth];
     if ( defaultWidth >= 0 )
     {
         [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];
 
     wxCocoaTableColumn* wxcol = new wxCocoaTableColumn( col1, editable );
     [col1 setColumn:wxcol];
 
@@ -336,32 +348,34 @@ wxListWidgetColumn* wxListWidgetCocoaImpl::InsertTextColumn( unsigned pos, const
     return wxcol;
 }
 
     return wxcol;
 }
 
-wxListWidgetColumn* wxListWidgetCocoaImpl::InsertCheckColumn( unsigned pos , const wxString& title, bool editable, 
-                                wxAlignment just, int defaultWidth ) 
+wxListWidgetColumn* wxListWidgetCocoaImpl::InsertCheckColumn( unsigned pos , const wxString& WXUNUSED(title), bool editable,
+                                wxAlignment WXUNUSED(just), int defaultWidth )
 {
    wxNSTableColumn* col1 = [[wxNSTableColumn alloc] init];
     [col1 setEditable:editable];
 {
    wxNSTableColumn* col1 = [[wxNSTableColumn alloc] init];
     [col1 setEditable:editable];
+
     // set your custom cell & set it up
     NSButtonCell* checkbox = [[NSButtonCell alloc] init];
     [checkbox setTitle:@""];
     [checkbox setButtonType:NSSwitchButton];
     [col1 setDataCell:checkbox] ;
     [checkbox release];
     // set your custom cell & set it up
     NSButtonCell* checkbox = [[NSButtonCell alloc] init];
     [checkbox setTitle:@""];
     [checkbox setButtonType:NSSwitchButton];
     [col1 setDataCell:checkbox] ;
     [checkbox release];
-             
+
     unsigned formerColCount = [m_tableView numberOfColumns];
     unsigned formerColCount = [m_tableView numberOfColumns];
-    
+
     // there's apparently no way to insert at a specific position
     [m_tableView addTableColumn:col1 ];
     if ( pos < formerColCount )
         [m_tableView moveColumn:formerColCount toColumn:pos];
     // there's apparently no way to insert at a specific position
     [m_tableView addTableColumn:col1 ];
     if ( pos < formerColCount )
         [m_tableView moveColumn:formerColCount toColumn:pos];
-        
+
     if ( defaultWidth >= 0 )
     {
         [col1 setMaxWidth:defaultWidth];
         [col1 setMinWidth:defaultWidth];
     if ( defaultWidth >= 0 )
     {
         [col1 setMaxWidth:defaultWidth];
         [col1 setMinWidth:defaultWidth];
+        [col1 setWidth:defaultWidth];
     }
     }
-    
+
+    [col1 setResizingMask: NSTableColumnNoResizing];
     wxCocoaTableColumn* wxcol = new wxCocoaTableColumn( col1, editable );
     [col1 setColumn:wxcol];
 
     wxCocoaTableColumn* wxcol = new wxCocoaTableColumn( col1, editable );
     [col1 setColumn:wxcol];
 
@@ -375,36 +389,17 @@ wxListWidgetColumn* wxListWidgetCocoaImpl::InsertCheckColumn( unsigned pos , con
 // inserting / removing lines
 //
 
 // inserting / removing lines
 //
 
-void wxListWidgetCocoaImpl::ListInsert( unsigned int n ) 
+void wxListWidgetCocoaImpl::ListInsert( unsigned int WXUNUSED(n) )
 {
 {
-#if 0
-    {
-        wxListBoxCocoaLine* line = new wxListBoxCocoaLine();
-        line->SetLabel(items[i]);
-        if ( m_items.size() <= n+i )
-            m_items.push_back( line );
-        else
-            m_items.insert(m_items.begin()+n, line);
-/*
-        NSMutableDictionary* line = [[NSMutableDictionary alloc] init];
-        [line setObject:wxCFStringRef(items[i]).AsNSString() forKey:column1];
-        NSMutableArray* array = [m_dataSource items];
-        if ( [array count] <= n+i )
-            [array addObject:line];
-        else
-            [array insertObject:line atIndex:n];
-*/
-    }
-#endif
     [m_tableView reloadData];
 }
 
     [m_tableView reloadData];
 }
 
-void wxListWidgetCocoaImpl::ListDelete( unsigned int n ) 
+void wxListWidgetCocoaImpl::ListDelete( unsigned int WXUNUSED(n) )
 {
     [m_tableView reloadData];
 }
 
 {
     [m_tableView reloadData];
 }
 
-void wxListWidgetCocoaImpl::ListClear() 
+void wxListWidgetCocoaImpl::ListClear()
 {
     [m_tableView reloadData];
 }
 {
     [m_tableView reloadData];
 }
@@ -416,7 +411,7 @@ void wxListWidgetCocoaImpl::ListDeselectAll()
     [m_tableView deselectAll:nil];
 }
 
     [m_tableView deselectAll:nil];
 }
 
-void wxListWidgetCocoaImpl::ListSetSelection( unsigned int n, bool select, bool multi ) 
+void wxListWidgetCocoaImpl::ListSetSelection( unsigned int n, bool select, bool multi )
 {
     // TODO
     if ( select )
 {
     // TODO
     if ( select )
@@ -426,91 +421,131 @@ void wxListWidgetCocoaImpl::ListSetSelection( unsigned int n, bool select, bool
 
 }
 
 
 }
 
-int wxListWidgetCocoaImpl::ListGetSelection() const 
+int wxListWidgetCocoaImpl::ListGetSelection() const
 {
 {
-    return 0;
+    return [m_tableView selectedRow];
 }
 
 }
 
-int wxListWidgetCocoaImpl::ListGetSelections( wxArrayInt& aSelections ) const 
+int wxListWidgetCocoaImpl::ListGetSelections( wxArrayInt& aSelections ) const
 {
 {
-    return 0;
+    aSelections.Empty();
+
+    int count = ListGetCount();
+
+    for ( int i = 0; i < count; ++i)
+    {
+        if ([m_tableView isRowSelected:count])
+        aSelections.Add(i);
+    }
+
+    return aSelections.Count();
 }
 
 }
 
-bool wxListWidgetCocoaImpl::ListIsSelected( unsigned int n ) const 
+bool wxListWidgetCocoaImpl::ListIsSelected( unsigned int n ) const
 {
 {
-    return false;
+    return [m_tableView isRowSelected:n];
 }
 
 // display
 
 }
 
 // display
 
-void wxListWidgetCocoaImpl::ListScrollTo( unsigned int n ) 
+void wxListWidgetCocoaImpl::ListScrollTo( unsigned int n )
 {
     [m_tableView scrollRowToVisible:n];
 }
 
 {
     [m_tableView scrollRowToVisible:n];
 }
 
-    
-void wxListWidgetCocoaImpl::UpdateLine( unsigned int n, wxListWidgetColumn* col ) 
+
+void wxListWidgetCocoaImpl::UpdateLine( unsigned int WXUNUSED(n), wxListWidgetColumn* WXUNUSED(col) )
 {
     // TODO optimize
     [m_tableView reloadData];
 }
 
 {
     // TODO optimize
     [m_tableView reloadData];
 }
 
-void wxListWidgetCocoaImpl::UpdateLineToEnd( unsigned int n) 
+void wxListWidgetCocoaImpl::UpdateLineToEnd( unsigned int WXUNUSED(n))
 {
     // TODO optimize
     [m_tableView reloadData];
 }
 
 {
     // TODO optimize
     [m_tableView reloadData];
 }
 
+void wxListWidgetCocoaImpl::controlAction(WXWidget WXUNUSED(slf),void* WXUNUSED(_cmd), void *WXUNUSED(sender))
+{
+    wxListBox *list = static_cast<wxListBox*> ( GetWXPeer());
+    wxCHECK_RET( list != NULL , wxT("Listbox expected"));
+
+    wxCommandEvent event( wxEVT_COMMAND_LISTBOX_SELECTED, list->GetId() );
+
+    int sel = [m_tableView clickedRow];
+    if ((sel < 0) || (sel > (int) list->GetCount()))  // OS X can select an item below the last item (why?)
+       return;
+
+    list->HandleLineEvent( sel, false );
+}
+
+void wxListWidgetCocoaImpl::controlDoubleAction(WXWidget WXUNUSED(slf),void* WXUNUSED(_cmd), void *WXUNUSED(sender))
+{
+    wxListBox *list = static_cast<wxListBox*> ( GetWXPeer());
+    wxCHECK_RET( list != NULL , wxT("Listbox expected"));
+
+    int sel = [m_tableView clickedRow];
+    if ((sel < 0) || (sel > (int) list->GetCount()))  // OS X can select an item below the last item (why?)
+       return;
+
+    list->HandleLineEvent( sel, true );
+}
 
 // accessing content
 
 
 
 // accessing content
 
 
-wxWidgetImplType* wxWidgetImpl::CreateListBox( wxWindowMac* wxpeer, 
-                                    wxWindowMac* parent, 
-                                    wxWindowID id, 
-                                    const wxPoint& pos, 
+wxWidgetImplType* wxWidgetImpl::CreateListBox( wxWindowMac* wxpeer,
+                                    wxWindowMac* WXUNUSED(parent),
+                                    wxWindowID WXUNUSED(id),
+                                    const wxPoint& pos,
                                     const wxSize& size,
                                     const wxSize& size,
-                                    long style, 
-                                    long extraStyle)
+                                    long style,
+                                    long WXUNUSED(extraStyle))
 {
 {
-    NSView* superv = (wxpeer->GetParent()->GetHandle() );
-    
     NSRect r = wxOSXGetFrameForControl( wxpeer, pos , size ) ;
     NSScrollView* scrollview = [[NSScrollView alloc] initWithFrame:r];
     NSRect r = wxOSXGetFrameForControl( wxpeer, pos , size ) ;
     NSScrollView* scrollview = [[NSScrollView alloc] initWithFrame:r];
-    
+
     // use same scroll flags logic as msw
     // use same scroll flags logic as msw
-    
+
     [scrollview setHasVerticalScroller:YES];
     [scrollview setHasVerticalScroller:YES];
-    
+
     if ( style & wxLB_HSCROLL )
         [scrollview setHasHorizontalScroller:YES];
     if ( style & wxLB_HSCROLL )
         [scrollview setHasHorizontalScroller:YES];
-    
+
     [scrollview setAutohidesScrollers: ((style & wxLB_ALWAYS_SB) ? NO : YES)];
     [scrollview setAutohidesScrollers: ((style & wxLB_ALWAYS_SB) ? NO : YES)];
-    
+
     // setting up the true table
     // setting up the true table
-    
+
     wxNSTableView* tableview = [[wxNSTableView alloc] init];
     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];
     // 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];
     // 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];
     wxNSTableDataSource* ds = [[ wxNSTableDataSource alloc] init];
     [tableview setDataSource:ds];
-    [superv addSubview:scrollview];
+    [scrollview setDocumentView:tableview];
+    [tableview release];
+
     wxListWidgetCocoaImpl* c = new wxListWidgetCocoaImpl( wxpeer, scrollview, tableview, ds );
     wxListWidgetCocoaImpl* c = new wxListWidgetCocoaImpl( wxpeer, scrollview, tableview, ds );
-    [tableview setImplementation:c];
+
+    // temporary hook for dnd
+    [tableview registerForDraggedTypes:[NSArray arrayWithObjects:
+        NSStringPboardType, NSFilenamesPboardType, NSTIFFPboardType, NSPICTPboardType, NSPDFPboardType, nil]];
+
     [ds setImplementation:c];
     return c;
 }
 
     [ds setImplementation:c];
     return c;
 }
 
-int wxListBox::DoListHitTest(const wxPoint& inpoint) const
+int wxListBox::DoListHitTest(const wxPoint& WXUNUSED(inpoint)) const
 {
 #if wxOSX_USE_CARBON
     OSStatus err;
 {
 #if wxOSX_USE_CARBON
     OSStatus err;