]> git.saurik.com Git - wxWidgets.git/blobdiff - src/osx/cocoa/listbox.mm
Fix for sheets based on NSAlert.
[wxWidgets.git] / src / osx / cocoa / listbox.mm
index 270d3ba4df2532ac0e9aa4365fb4762ec66e4c4b..45f1126bf489249df37523b2017aad597be520b8 100644 (file)
@@ -14,6 +14,7 @@
 #if wxUSE_LISTBOX
 
 #include "wx/listbox.h"
+#include "wx/dnd.h"
 
 #ifndef WX_PRECOMP
     #include "wx/log.h"
@@ -54,14 +55,8 @@ class wxListWidgetCocoaImpl;
 
 @interface wxNSTableView : NSTableView
 {
-    wxListWidgetCocoaImpl* impl;
 }
 
-- (void)setImplementation: (wxListWidgetCocoaImpl *) theImplementation;
-- (wxListWidgetCocoaImpl*) implementation;
-- (void)clickedAction: (id) sender;
-- (void)doubleClickedAction: (id) sender;
-
 @end
 
 //
@@ -147,6 +142,9 @@ public :
     }
     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(void* _cmd);
 protected :
     wxNSTableView*          m_tableView ;
     
@@ -274,55 +272,13 @@ protected:
 
 @implementation wxNSTableView
 
-- (void)setImplementation: (wxListWidgetCocoaImpl *) theImplementation
-{
-    impl = theImplementation;
-}
-
-- (wxListWidgetCocoaImpl*) implementation
-{
-    return impl;
-}
-
-- (id) init
-{
-    [super init];
-    impl = NULL;
-    [self setTarget: self];
-    [self setAction: @selector(clickedAction:)];
-    [self setDoubleAction: @selector(doubleClickedAction:)];
-    return self;
-}
-
-- (void) clickedAction: (id) sender
-{
-    if ( impl )
-    {
-        wxListBox *list = static_cast<wxListBox*> ( impl->GetWXPeer());
-        wxCHECK_RET( list != NULL , wxT("Listbox expected"));
-
-        wxCommandEvent event( wxEVT_COMMAND_LISTBOX_SELECTED, list->GetId() );
-
-        int sel = [self 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) doubleClickedAction: (id) sender
++ (void)initialize
 {
-    if ( impl )
+    static BOOL initialized = NO;
+    if (!initialized) 
     {
-        wxListBox *list = static_cast<wxListBox*> ( impl->GetWXPeer());
-        wxCHECK_RET( list != NULL , wxT("Listbox expected"));
-
-        int sel = [self clickedRow];
-        if ((sel < 0) || (sel > (int) list->GetCount()))  // OS X can select an item below the last item (why?)
-           return;
-
-        list->HandleLineEvent( sel, true );
+        initialized = YES;
+        wxOSXCocoaClassAddWXMethods( self );
     }
 }
 
@@ -335,6 +291,7 @@ protected:
 wxListWidgetCocoaImpl::wxListWidgetCocoaImpl( wxWindowMac* peer, NSScrollView* view, wxNSTableView* tableview, wxNSTableDataSource* data ) :
     wxWidgetCocoaImpl( peer, view ), m_tableView(tableview), m_dataSource(data)
 {
+    InstallEventHandler( tableview );
 }
 
 wxListWidgetCocoaImpl::~wxListWidgetCocoaImpl()
@@ -369,8 +326,17 @@ wxListWidgetColumn* wxListWidgetCocoaImpl::InsertTextColumn( unsigned pos, const
     {
         [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];
 
@@ -403,8 +369,10 @@ wxListWidgetColumn* wxListWidgetCocoaImpl::InsertCheckColumn( unsigned pos , con
     {
         [col1 setMaxWidth:defaultWidth];
         [col1 setMinWidth:defaultWidth];
+        [col1 setWidth:defaultWidth];
     }
     
+    [col1 setResizingMask: NSTableColumnNoResizing];
     wxCocoaTableColumn* wxcol = new wxCocoaTableColumn( col1, editable );
     [col1 setColumn:wxcol];
 
@@ -514,6 +482,31 @@ void wxListWidgetCocoaImpl::UpdateLineToEnd( unsigned int n)
     [m_tableView reloadData];
 }
 
+void wxListWidgetCocoaImpl::controlAction(WXWidget slf,void* _cmd, void *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(void* _cmd)
+{
+    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
 
@@ -537,13 +530,10 @@ wxWidgetImplType* wxWidgetImpl::CreateListBox( wxWindowMac* wxpeer,
         [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];
@@ -551,11 +541,22 @@ wxWidgetImplType* wxWidgetImpl::CreateListBox( wxWindowMac* wxpeer,
     // 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 );
-    [tableview setImplementation:c];
+
+    // temporary hook for dnd
+    [tableview registerForDraggedTypes:[NSArray arrayWithObjects:
+        NSStringPboardType, NSFilenamesPboardType, NSTIFFPboardType, NSPICTPboardType, NSPDFPboardType, nil]];
+
     [ds setImplementation:c];
     return c;
 }