X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/289532452089421ddadbd4726a8469511a19ab76..3678169caab0f713415414dce013a638305f3cce:/src/osx/choice_osx.cpp diff --git a/src/osx/choice_osx.cpp b/src/osx/choice_osx.cpp index e3d6cdab48..7dd17476cf 100644 --- a/src/osx/choice_osx.cpp +++ b/src/osx/choice_osx.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: src/osx/carbon/choice.cpp +// Name: src/osx/choice_osx.cpp // Purpose: wxChoice // Author: Stefan Csomor // Modified by: @@ -65,20 +65,20 @@ bool wxChoice::Create(wxWindow *parent, long style, const wxValidator& validator, const wxString& name ) -{ - m_macIsUserPane = false; - +{ + DontCreatePeer(); + if ( !wxChoiceBase::Create( parent, id, pos, size, style, validator, name ) ) return false; m_popUpMenu = new wxMenu(); m_popUpMenu->SetNoEventsMode(true); - m_peer = wxWidgetImpl::CreateChoice( this, parent, id, m_popUpMenu, pos, size, style, GetExtraStyle() ); + SetPeer(wxWidgetImpl::CreateChoice( this, parent, id, m_popUpMenu, pos, size, style, GetExtraStyle() )); MacPostControlCreate( pos, size ); -#if !wxUSE_STL +#if !wxUSE_STD_CONTAINERS if ( style & wxCB_SORT ) // autosort m_strings = wxArrayString( 1 ); @@ -100,6 +100,13 @@ bool wxChoice::Create(wxWindow *parent, // adding/deleting items to/from the list // ---------------------------------------------------------------------------- +void wxChoice::DoAfterItemCountChange() +{ + InvalidateBestSize(); + + GetPeer()->SetMaximum( GetCount() ); +} + int wxChoice::DoInsertItems(const wxArrayStringsAdapter & items, unsigned int pos, void **clientData, wxClientDataType type) @@ -109,7 +116,7 @@ int wxChoice::DoInsertItems(const wxArrayStringsAdapter & items, { unsigned int idx; -#if wxUSE_STL +#if wxUSE_STD_CONTAINERS if ( IsSorted() ) { wxArrayString::iterator @@ -118,7 +125,7 @@ int wxChoice::DoInsertItems(const wxArrayStringsAdapter & items, m_strings.insert( insertPoint, items[i] ); } else -#endif // wxUSE_STL +#endif // wxUSE_STD_CONTAINERS { idx = pos; m_strings.Insert( items[i], idx ); @@ -132,7 +139,7 @@ int wxChoice::DoInsertItems(const wxArrayStringsAdapter & items, AssignNewItemClientData(idx, clientData, i, type); } - m_peer->SetMaximum( GetCount() ); + DoAfterItemCountChange(); return pos - 1; } @@ -148,8 +155,8 @@ void wxChoice::DoDeleteOneItem(unsigned int n) m_strings.RemoveAt( n ) ; m_datas.RemoveAt( n ) ; - m_peer->SetMaximum( GetCount() ) ; + DoAfterItemCountChange(); } void wxChoice::DoClear() @@ -162,7 +169,7 @@ void wxChoice::DoClear() m_strings.Empty() ; m_datas.Empty() ; - m_peer->SetMaximum( 0 ) ; + DoAfterItemCountChange(); } // ---------------------------------------------------------------------------- @@ -170,12 +177,12 @@ void wxChoice::DoClear() // ---------------------------------------------------------------------------- int wxChoice::GetSelection() const { - return m_peer->GetValue(); + return GetPeer()->GetValue(); } void wxChoice::SetSelection( int n ) { - m_peer->SetValue( n ); + GetPeer()->SetValue( n ); } // ---------------------------------------------------------------------------- @@ -189,7 +196,7 @@ unsigned int wxChoice::GetCount() const int wxChoice::FindString( const wxString& s, bool bCase ) const { -#if !wxUSE_STL +#if !wxUSE_STD_CONTAINERS // Avoid assert for non-default args passed to sorted array Index if ( IsSorted() ) bCase = true; @@ -219,74 +226,30 @@ wxString wxChoice::GetString(unsigned int n) const // ---------------------------------------------------------------------------- void wxChoice::DoSetItemClientData(unsigned int n, void* clientData) { - wxCHECK_RET( IsValid(n), wxT("wxChoice::DoSetItemClientData: invalid index") ); - m_datas[n] = (char*)clientData ; } void * wxChoice::DoGetItemClientData(unsigned int n) const { - wxCHECK_MSG( IsValid(n), NULL, wxT("wxChoice::DoGetClientData: invalid index") ); - return (void *)m_datas[n]; } bool wxChoice::OSXHandleClicked( double WXUNUSED(timestampsec) ) { - wxCommandEvent event( wxEVT_COMMAND_CHOICE_SELECTED, m_windowId ); - - // actually n should be made sure by the os to be a valid selection, but ... - int n = GetSelection(); - if ( n > -1 ) - { - event.SetInt( n ); - event.SetString( GetStringSelection() ); - event.SetEventObject( this ); - - if ( HasClientObjectData() ) - event.SetClientObject( GetClientObject( n ) ); - else if ( HasClientUntypedData() ) - event.SetClientData( GetClientData( n ) ); - - ProcessCommand( event ); - } + SendSelectionChangedEvent(wxEVT_CHOICE); return true ; } wxSize wxChoice::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 ; - - wxCoord width, height ; - dc.GetTextExtent( wxT("X"), &width, &height); - int cx = width ; - - lbWidth += cx ; - } + // We use the base window size for the height (which is wrong as it doesn't + // take the font into account -- TODO) and add some margins to the width + // computed by the base class method to account for the arrow. + const int lbHeight = wxWindow::DoGetBestSize().y; - return wxSize( lbWidth, lbHeight ); + return wxSize(wxChoiceBase::DoGetBestSize().x + 2*lbHeight + GetCharWidth(), + lbHeight); } #endif // wxUSE_CHOICE