void DestroyPopup();
// override the base class virtuals involved in geometry calculations
+ // The common version only sets a default width, so the derived classes
+ // should override it and set the height and change the width as needed.
virtual wxSize DoGetBestSize() const;
+ virtual wxSize DoGetSizeFromTextSize(int xlen, int ylen = -1) const;
// also set the embedded wxTextCtrl colours
virtual bool SetForegroundColour(const wxColour& colour);
// Callback for item width, or -1 for default/undetermined
virtual wxCoord OnMeasureItemWidth( size_t item ) const;
+ // override base implementation so we can return the size for the
+ // largest item
+ virtual wxSize DoGetBestSize() const;
+
// Callback for background drawing. Flags are same as with
// OnDrawItem.
virtual void OnDrawBackground( wxDC& dc, const wxRect& rect, int item, int flags ) const;
wxSize wxComboCtrlBase::DoGetBestSize() const
{
- wxSize sizeText(150,0);
+ int width = m_text ? m_text->GetBestSize().x : 80;
- if ( m_text )
- sizeText = m_text->GetBestSize();
+ return GetSizeFromTextSize(width);
+}
- // TODO: Better method to calculate close-to-native control height.
+wxSize wxComboCtrlBase::DoGetSizeFromTextSize(int xlen, int ylen) const
+{
+ // Calculate close-to-native control height
int fhei;
+
+#if wxUSE_COMBOBOX && (defined(__WXMSW__) || defined(__WXGTK__)) \
+ && !defined(__WXUNIVERSAL__)
+ wxComboBox* cb = new wxComboBox;
+ cb->Hide();
+ cb->Create(const_cast<wxComboCtrlBase*>(this), wxID_ANY);
+ if ( m_font.IsOk() )
+ cb->SetFont(m_font);
+ fhei = cb->GetBestSize().y;
+ cb->Destroy();
+#else
if ( m_font.IsOk() )
fhei = (m_font.GetPointSize()*2) + 5;
else if ( wxNORMAL_FONT->IsOk() )
fhei = (wxNORMAL_FONT->GetPointSize()*2) + 5;
else
- fhei = sizeText.y + 4;
+ fhei = 22;
+#endif // only for wxComboBox on MSW or GTK
// Need to force height to accommodate bitmap?
int btnSizeY = m_btnSize.y;
fhei += 4;
*/
- // Final adjustments
-#ifdef __WXGTK__
- fhei += 1;
-#endif
-
#ifdef __WXMAC__
// these are the numbers from the HIG:
switch ( m_windowVariant )
#endif
fhei += 2 * FOCUS_RING;
- int width = sizeText.x + FOCUS_RING + COMBO_MARGIN + DEFAULT_DROPBUTTON_WIDTH;
- wxSize ret(width, fhei);
- CacheBestSize(ret);
- return ret;
+ // Calculate width
+ int fwid = xlen + FOCUS_RING + COMBO_MARGIN + DEFAULT_DROPBUTTON_WIDTH;
+
+ // Add the margins we have previously set
+ wxPoint marg( GetMargins() );
+ fwid += wxMax(0, marg.x);
+ fhei += wxMax(0, marg.y);
+
+ if ( ylen > 0 )
+ fhei += ylen - GetCharHeight();
+
+ return wxSize(fwid, fhei);
}
void wxComboCtrlBase::OnSizeEvent( wxSizeEvent& event )
void wxComboCtrlBase::OnFocusEvent( wxFocusEvent& event )
{
-// On Mac, this leads to infinite recursion and eventually a crash
+// On Mac, this leads to infinite recursion and eventually a crash
#ifndef __WXMAC__
if ( event.GetEventType() == wxEVT_SET_FOCUS )
{
// wxWindow::GetTextExtent (assuming same dc is used
// for all calls, as we do here).
wxClientDC dc(m_combo);
+ if ( !m_useFont.IsOk() )
+ m_useFont = m_combo->GetFont();
dc.SetFont(m_useFont);
for ( i=0; i<n; i++ )
return -1;
}
+wxSize wxOwnerDrawnComboBox::DoGetBestSize() const
+{
+ wxSize best( wxComboCtrlBase::DoGetBestSize() );
+
+ if ( GetCount() > 0 )
+ {
+ wxOwnerDrawnComboBox* odc = const_cast<wxOwnerDrawnComboBox*>(this);
+ best.x = odc->GetWidestItemWidth();
+ // TODO: this class may also have GetHightestItemHeight() and
+ // GetHightestItem() methods, and so set the whole (edit part + arrow)
+ // control's height according with this max height, not only max width.
+ }
+
+ return GetSizeFromTextSize(best.x);
+}
+
void wxOwnerDrawnComboBox::OnDrawBackground(wxDC& dc,
const wxRect& rect,
int WXUNUSED(item),