X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4ddfa282fa8e9025cf586ac3b2a545fbbfeb27b1..779a4d41ef6d606d39b03b4a7fa5fe27565bb66c:/src/osx/cocoa/combobox.mm?ds=sidebyside diff --git a/src/osx/cocoa/combobox.mm b/src/osx/cocoa/combobox.mm index b090c3ae83..a6c9e9b7c4 100644 --- a/src/osx/cocoa/combobox.mm +++ b/src/osx/cocoa/combobox.mm @@ -20,7 +20,7 @@ #include "wx/dcclient.h" #endif -#include "wx/osx/private.h" +#include "wx/osx/cocoa/private/textimpl.h" // work in progress @@ -42,31 +42,116 @@ } } -- (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()) + { + wxWindow* wxpeer = (wxWindow*) impl->GetWXPeer(); + if ( wxpeer ) { + wxCommandEvent event(wxEVT_COMMAND_COMBOBOX_SELECTED, wxpeer->GetId()); + event.SetEventObject( wxpeer ); + event.SetInt( static_cast(wxpeer)->GetSelection() ); + // 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. + wxpeer->GetEventHandler()->AddPendingEvent( event ); + } + } } - @end +wxNSComboBoxControl::wxNSComboBoxControl( wxWindow *wxPeer, WXWidget w ) : wxNSTextFieldControl(wxPeer, w) +{ + m_comboBox = (NSComboBox*)w; +} + +wxNSComboBoxControl::~wxNSComboBoxControl() +{ +} + +int wxNSComboBoxControl::GetSelectedItem() const +{ + return [m_comboBox indexOfSelectedItem]; +} + +void wxNSComboBoxControl::SetSelectedItem(int item) +{ + wxASSERT_MSG(item >= 0 && item < [m_comboBox numberOfItems], "Inavlid item index."); + SendEvents(false); + [m_comboBox selectItemAtIndex: item]; + 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 +{ + int result = [m_comboBox indexOfItemWithObjectValue:wxCFStringRef( text , m_wxPeer->GetFont().GetEncoding() ).AsNSString()]; + if (result == NSNotFound) + result = wxNOT_FOUND; + return result; +} + wxWidgetImplType* wxWidgetImpl::CreateComboBox( wxWindowMac* wxpeer, wxWindowMac* WXUNUSED(parent), wxWindowID WXUNUSED(id), wxMenu* 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 pullsDown:NO]; - wxWidgetCocoaImpl* c = new wxWidgetCocoaImpl( wxpeer, v ); + wxNSComboBox* v = [[wxNSComboBox alloc] initWithFrame:r]; + if (style & wxCB_READONLY) + [v setEditable:NO]; + wxNSComboBoxControl* c = new wxNSComboBoxControl( wxpeer, v ); return c; } -#endif // wxUSE_CHOICE +#endif // wxUSE_COMBOBOX \ No newline at end of file