X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f941a30bef665561d96d29c4cee07471dbbd497f..bc9d3d911cfb51f612a699d7fb00f57eb5b2097c:/src/osx/cocoa/combobox.mm diff --git a/src/osx/cocoa/combobox.mm b/src/osx/cocoa/combobox.mm index bd58b492d7..f0d4ea6677 100644 --- a/src/osx/cocoa/combobox.mm +++ b/src/osx/cocoa/combobox.mm @@ -4,26 +4,38 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: combobox.mm 54129 2008-06-11 19:30:52Z SC $ +// RCS-ID: $Id$ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// #include "wx/wxprec.h" -#if wxUSE_COMBOBOX && defined(wxOSX_USE_NATIVE_COMBOBOX) +#if wxUSE_COMBOBOX #include "wx/combobox.h" +#include "wx/evtloop.h" #ifndef WX_PRECOMP #include "wx/menu.h" #include "wx/dcclient.h" #endif -#include "wx/osx/private.h" +#include "wx/osx/cocoa/private/textimpl.h" // work in progress +@interface wxNSTableDataSource : NSObject wxOSX_10_6_AND_LATER() +{ + wxNSComboBoxControl* impl; +} + +- (NSInteger)numberOfItemsInComboBox:(NSComboBox *)aComboBox; +- (id)comboBox:(NSComboBox *)aComboBox objectValueForItemAtIndex:(NSInteger)index; + +@end + + @interface wxNSComboBox : NSComboBox { } @@ -42,31 +54,184 @@ } } -- (int) intValue +- (void)controlTextDidChange:(NSNotification *)aNotification { - return [self indexOfSelectedItem]; + wxUnusedVar(aNotification); + wxWidgetCocoaImpl* impl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( self ); + if ( impl && impl->ShouldSendEvents() ) + { + wxWindow* wxpeer = (wxWindow*) impl->GetWXPeer(); + if ( wxpeer ) { + wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, wxpeer->GetId()); + event.SetEventObject( wxpeer ); + event.SetString( static_cast(wxpeer)->GetValue() ); + wxpeer->HandleWindowEvent( event ); + } + } } -- (void) setIntValue: (int) v +- (void)comboBoxSelectionDidChange:(NSNotification *)notification { - [self selectItemAtIndex:v]; -} + wxUnusedVar(notification); + wxWidgetCocoaImpl* impl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( self ); + if ( impl && impl->ShouldSendEvents()) + { + wxComboBox* wxpeer = static_cast(impl->GetWXPeer()); + if ( wxpeer ) { + const int sel = wxpeer->GetSelection(); + + wxCommandEvent event(wxEVT_COMMAND_COMBOBOX_SELECTED, wxpeer->GetId()); + event.SetEventObject( wxpeer ); + event.SetInt( sel ); + event.SetString( wxpeer->GetString(sel) ); + // For some reason, wxComboBox::GetValue will not return the newly selected item + // while we're inside this callback, so use AddPendingEvent to make sure + // GetValue() returns the right value. + wxEventLoop* const loop = (wxEventLoop*) wxEventLoopBase::GetActive(); + if ( loop ) + loop->OSXUseLowLevelWakeup(true); + wxpeer->GetEventHandler()->AddPendingEvent( event ); + + if ( loop ) + loop->OSXUseLowLevelWakeup(false); + } + } +} @end -wxWidgetImplType* wxWidgetImpl::CreateComboBox( wxWindowMac* wxpeer, +wxNSComboBoxControl::wxNSComboBoxControl( wxComboBox *wxPeer, WXWidget w ) + : wxNSTextFieldControl(wxPeer, wxPeer, w) +{ + m_comboBox = (NSComboBox*)w; +} + +wxNSComboBoxControl::~wxNSComboBoxControl() +{ +} + +int wxNSComboBoxControl::GetSelectedItem() const +{ + return [m_comboBox indexOfSelectedItem]; +} + +void wxNSComboBoxControl::SetSelectedItem(int item) +{ + SendEvents(false); + + if ( item != wxNOT_FOUND ) + { + wxASSERT_MSG( item >= 0 && item < [m_comboBox numberOfItems], + "Inavlid item index." ); + [m_comboBox selectItemAtIndex: item]; + } + else // remove current selection (if we have any) + { + const int sel = GetSelectedItem(); + if ( sel != wxNOT_FOUND ) + [m_comboBox deselectItemAtIndex:sel]; + } + + SendEvents(true); +} + +int wxNSComboBoxControl::GetNumberOfItems() const +{ + return [m_comboBox numberOfItems]; +} + +void wxNSComboBoxControl::InsertItem(int pos, const wxString& item) +{ + [m_comboBox insertItemWithObjectValue:wxCFStringRef( item , m_wxPeer->GetFont().GetEncoding() ).AsNSString() atIndex:pos]; +} + +void wxNSComboBoxControl::RemoveItem(int pos) +{ + SendEvents(false); + [m_comboBox removeItemAtIndex:pos]; + SendEvents(true); +} + +void wxNSComboBoxControl::Clear() +{ + SendEvents(false); + [m_comboBox removeAllItems]; + SendEvents(true); +} + +wxString wxNSComboBoxControl::GetStringAtIndex(int pos) const +{ + return wxCFStringRef::AsString([m_comboBox itemObjectValueAtIndex:pos], m_wxPeer->GetFont().GetEncoding()); +} + +int wxNSComboBoxControl::FindString(const wxString& text) const +{ + NSInteger nsresult = [m_comboBox indexOfItemWithObjectValue:wxCFStringRef( text , m_wxPeer->GetFont().GetEncoding() ).AsNSString()]; + + int result; + if (nsresult == NSNotFound) + result = wxNOT_FOUND; + else + result = (int) nsresult; + return result; +} + +void wxNSComboBoxControl::Popup() +{ + id ax = NSAccessibilityUnignoredDescendant(m_comboBox); + [ax accessibilitySetValue: [NSNumber numberWithBool: YES] forAttribute: NSAccessibilityExpandedAttribute]; +} + +void wxNSComboBoxControl::Dismiss() +{ + id ax = NSAccessibilityUnignoredDescendant(m_comboBox); + [ax accessibilitySetValue: [NSNumber numberWithBool: NO] forAttribute: NSAccessibilityExpandedAttribute]; +} + +wxWidgetImplType* wxWidgetImpl::CreateComboBox( wxComboBox* wxpeer, wxWindowMac* WXUNUSED(parent), wxWindowID WXUNUSED(id), - wxMenu* menu, + wxMenu* WXUNUSED(menu), const wxPoint& pos, const wxSize& size, - long WXUNUSED(style), + long style, long WXUNUSED(extraStyle)) { NSRect r = wxOSXGetFrameForControl( wxpeer, pos , size ) ; wxNSComboBox* v = [[wxNSComboBox alloc] initWithFrame:r]; - wxWidgetCocoaImpl* c = new wxWidgetCocoaImpl( wxpeer, v ); + if (style & wxCB_READONLY) + [v setEditable:NO]; + wxNSComboBoxControl* c = new wxNSComboBoxControl( wxpeer, v ); return c; } -#endif // wxUSE_COMBOBOX && defined(wxOSX_USE_NATIVE_COMBOBOX) +wxSize wxComboBox::DoGetBestSize() const +{ + int lbWidth = GetCount() > 0 ? 20 : 100; // some defaults + wxSize baseSize = wxWindow::DoGetBestSize(); + int lbHeight = baseSize.y; + int wLine; + + { + wxClientDC dc(const_cast(this)); + + // Find the widest line + for(unsigned int i = 0; i < GetCount(); i++) + { + wxString str(GetString(i)); + + wxCoord width, height ; + dc.GetTextExtent( str , &width, &height); + wLine = width ; + + lbWidth = wxMax( lbWidth, wLine ) ; + } + + // Add room for the popup arrow + lbWidth += 2 * lbHeight ; + } + + return wxSize( lbWidth, lbHeight ); +} + +#endif // wxUSE_COMBOBOX