// Created: 2003/03/18
// Id: $Id$
// Copyright: (c) 2003 David Elliott
-// Licence: wxWidgets licence
+// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#include "wx/wxprec.h"
#import <AppKit/NSScrollView.h>
#import <AppKit/NSCell.h>
-// ============================================================================
-// @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
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)
[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];
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
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];
bool wxListBox::_WxCocoa_GetNeedsUpdate()
{
- return static_cast<wxCocoaListBoxNSTableDataSource*>(m_cocoaDataSource)->m_needsUpdate;
+ return m_needsUpdate;
}
void wxListBox::_WxCocoa_SetNeedsUpdate(bool needsUpdate)
{
- static_cast<wxCocoaListBoxNSTableDataSource*>(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);