+ 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 );
+ }
+
+ return noErr ;
+}
+
+wxSize wxChoice::DoGetBestSize() const
+{
+ int lbWidth = GetCount() > 0 ? 20 : 100; // some defaults
+ int lbHeight = 20;
+ int wLine;
+
+ SInt32 metric ;
+
+ GetThemeMetric( kThemeMetricPopupButtonHeight , &metric );
+ lbHeight = metric ;
+
+ {
+ wxClientDC dc(const_cast<wxChoice*>(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 ;
+ lbHeight += 4;
+
+ lbWidth += cx ;
+ }
+
+ return wxSize( lbWidth, lbHeight );