X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/2c755d9bbf4c786a03cf6193c630fc986a69f802..3721dc6efe6f9ffe550c4c83bee2da210043bcaa:/src/osx/cocoa/combobox.mm diff --git a/src/osx/cocoa/combobox.mm b/src/osx/cocoa/combobox.mm index 56ce4b05ca..d98f0a331e 100644 --- a/src/osx/cocoa/combobox.mm +++ b/src/osx/cocoa/combobox.mm @@ -46,7 +46,7 @@ { wxUnusedVar(aNotification); wxWidgetCocoaImpl* impl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( self ); - if ( impl ) + if ( impl && impl->ShouldSendEvents() ) { wxWindow* wxpeer = (wxWindow*) impl->GetWXPeer(); if ( wxpeer ) { @@ -62,7 +62,7 @@ { wxUnusedVar(notification); wxWidgetCocoaImpl* impl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( self ); - if ( impl ) + if ( impl && impl->ShouldSendEvents()) { wxWindow* wxpeer = (wxWindow*) impl->GetWXPeer(); if ( wxpeer ) { @@ -78,7 +78,8 @@ } @end -wxNSComboBoxControl::wxNSComboBoxControl( wxWindow *wxPeer, WXWidget w ) : wxNSTextFieldControl(wxPeer, w) +wxNSComboBoxControl::wxNSComboBoxControl( wxComboBox *wxPeer, WXWidget w ) + : wxNSTextFieldControl(wxPeer, wxPeer, w) { m_comboBox = (NSComboBox*)w; } @@ -94,7 +95,22 @@ int wxNSComboBoxControl::GetSelectedItem() const void wxNSComboBoxControl::SetSelectedItem(int item) { - [m_comboBox selectItemAtIndex: 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 @@ -109,12 +125,16 @@ void wxNSComboBoxControl::InsertItem(int pos, const wxString& item) 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 @@ -130,19 +150,50 @@ int wxNSComboBoxControl::FindString(const wxString& text) const return result; } -wxWidgetImplType* wxWidgetImpl::CreateComboBox( wxWindowMac* wxpeer, +wxWidgetImplType* wxWidgetImpl::CreateComboBox( wxComboBox* 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]; + if (style & wxCB_READONLY) + [v setEditable:NO]; wxNSComboBoxControl* c = new wxNSComboBoxControl( wxpeer, v ); return c; } -#endif // wxUSE_COMBOBOX \ No newline at end of file +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