X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/580cc1eb856780d56396da36a9f0f5826638ba3a..974c115dff4da4a370a3569a3576cacb00eef7bb:/src/cocoa/listbox.mm diff --git a/src/cocoa/listbox.mm b/src/cocoa/listbox.mm index 50b5c79472..5f287ac195 100644 --- a/src/cocoa/listbox.mm +++ b/src/cocoa/listbox.mm @@ -6,7 +6,7 @@ // Created: 2003/03/18 // Id: $Id$ // Copyright: (c) 2003 David Elliott -// Licence: wxWidgets licence +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// #include "wx/wxprec.h" @@ -33,23 +33,6 @@ #import #import -// ============================================================================ -// @class wxCocoaListBoxNSTableDataSource -// ============================================================================ -// 2.8 hack: We can't add an i-var to wxListBox so we add one here -@interface wxCocoaListBoxNSTableDataSource : wxCocoaNSTableDataSource -{ - BOOL m_needsUpdate; -} - -@end -WX_DECLARE_GET_OBJC_CLASS(wxCocoaListBoxNSTableDataSource,wxCocoaNSTableDataSource) - -@implementation wxCocoaListBoxNSTableDataSource -// No methods -@end -WX_IMPLEMENT_GET_OBJC_CLASS_WITH_UNIQUIFIED_SUPERCLASS(wxCocoaListBoxNSTableDataSource,wxCocoaNSTableDataSource) - // ============================================================================ // helper functions @@ -85,9 +68,7 @@ static void _SetWidthOfTableColumnToFitItems(NSTableColumn *tableColumn, NSArray // class wxListBox // ============================================================================ -IMPLEMENT_DYNAMIC_CLASS(wxListBox, wxControlWithItems) BEGIN_EVENT_TABLE(wxListBox, wxListBoxBase) - EVT_IDLE(wxListBox::_WxCocoa_OnIdle) END_EVENT_TABLE() WX_IMPLEMENT_COCOA_OWNER(wxListBox,NSTableView,NSControl,NSView) @@ -155,12 +136,14 @@ The listbox contents are sorted in alphabetical order. [GetNSTableView() setHeaderView: nil]; // Set up the data source - m_cocoaDataSource = [[WX_GET_OBJC_CLASS(wxCocoaListBoxNSTableDataSource) alloc] init]; + m_cocoaDataSource = [[WX_GET_OBJC_CLASS(wxCocoaNSTableDataSource) alloc] init]; [GetNSTableView() setDataSource:m_cocoaDataSource]; // Add the single column NSTableColumn *tableColumn = [[NSTableColumn alloc] initWithIdentifier:nil]; [GetNSTableView() addTableColumn: tableColumn]; + // By default, entries should not be editable + [tableColumn setEditable:NO]; [tableColumn release]; [GetNSTableView() sizeToFit]; @@ -172,13 +155,25 @@ The listbox contents are sorted in alphabetical order. CocoaCreateNSScrollView(); SetInitialFrameRect(pos,size); - [m_wxCocoaScrollView->GetNSScrollView() setHasVerticalScroller:YES]; - // Pre-10.3: Always show vertical scroller, never show horizontal scroller - // Post-10.3: Show scrollers dynamically (turn them both on, set auto-hide) - if([m_wxCocoaScrollView->GetNSScrollView() respondsToSelector:@selector(setAutohidesScrollers:)]) + if ((style & wxLB_NEEDED_SB) || (style & wxLB_ALWAYS_SB)) + { + [m_wxCocoaScrollView->GetNSScrollView() setHasVerticalScroller: YES]; + } + + if (style & wxLB_HSCROLL) + { + [m_wxCocoaScrollView->GetNSScrollView() setHasHorizontalScroller: YES]; + } + + // We can't set auto-hiding individually for horizontal/vertical scrollers, + // so we have settled on always allowing hiding for both unless the vertical + // setting is "always show". + if (((style & wxLB_NEEDED_SB) || (style & wxLB_HSCROLL)) && !(style & wxLB_ALWAYS_SB)) { - [m_wxCocoaScrollView->GetNSScrollView() setHasHorizontalScroller:YES]; - [m_wxCocoaScrollView->GetNSScrollView() setAutohidesScrollers:YES]; + if ([m_wxCocoaScrollView->GetNSScrollView() respondsToSelector:@selector(setAutohidesScrollers:)]) + { + [m_wxCocoaScrollView->GetNSScrollView() setAutohidesScrollers: YES]; + } } // Set up extended/multiple selection flags @@ -191,6 +186,20 @@ The listbox contents are sorted in alphabetical order. return true; } +wxSize wxListBox::DoGetBestSize() const +{ + wxSize size = wxControlWithItems::DoGetBestSize(); + // Limit best size to 100x100. It can be smaller if none of the items are very + // wide or if there aren't many items, but anything bigger than 100x100 ought + // to be asked for by the programmer. The 100x100 size is based on being barely + // enough for a scroller to be usable. + if(size.GetWidth() > 100) + size.SetWidth(100); + if(size.GetHeight() > 100) + size.SetHeight(100); + return size; +} + wxListBox::~wxListBox() { [GetNSTableView() setDataSource: nil]; @@ -202,17 +211,17 @@ wxListBox::~wxListBox() bool wxListBox::_WxCocoa_GetNeedsUpdate() { - return static_cast(m_cocoaDataSource)->m_needsUpdate; + return m_needsUpdate; } void wxListBox::_WxCocoa_SetNeedsUpdate(bool needsUpdate) { - static_cast(m_cocoaDataSource)->m_needsUpdate = needsUpdate; + m_needsUpdate = needsUpdate; } -void wxListBox::_WxCocoa_OnIdle(wxIdleEvent &event) +void wxListBox::OnInternalIdle() { - event.Skip(); + wxControlWithItems::OnInternalIdle(); if(_WxCocoa_GetNeedsUpdate()) { _SetWidthOfTableColumnToFitItems([[GetNSTableView() tableColumns] objectAtIndex:0], m_cocoaItems);