X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/2c755d9bbf4c786a03cf6193c630fc986a69f802..f9b4d680d72930c31fe14dd63421a85d97ccd739:/src/osx/cocoa/combobox.mm?ds=sidebyside diff --git a/src/osx/cocoa/combobox.mm b/src/osx/cocoa/combobox.mm index 56ce4b05ca..4aec03feb3 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 @@ -124,25 +144,60 @@ wxString wxNSComboBoxControl::GetStringAtIndex(int pos) const int wxNSComboBoxControl::FindString(const wxString& text) const { - int result = [m_comboBox indexOfItemWithObjectValue:wxCFStringRef( text , m_wxPeer->GetFont().GetEncoding() ).AsNSString()]; - if (result == NSNotFound) + 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; } -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