]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/combocmn.cpp
wxMessageBox off the main thread lost result code.
[wxWidgets.git] / src / common / combocmn.cpp
index d76166d771876eeced23451be3b04943d55ba6c9..82d16579609d4571ecf5fdb19d9b0b3fe4bc02ff 100644 (file)
 
 #include "wx/combo.h"
 
 
 #include "wx/combo.h"
 
+#ifdef __WXMSW__
+#include "wx/msw/private.h"
+#endif
+
 #if wxUSE_COMBOBOX
 #include "wx/combobox.h"
 extern WXDLLEXPORT_DATA(const char) wxComboBoxNameStr[] = "comboBox";
 #if wxUSE_COMBOBOX
 #include "wx/combobox.h"
 extern WXDLLEXPORT_DATA(const char) wxComboBoxNameStr[] = "comboBox";
@@ -1370,15 +1374,31 @@ wxSize wxComboCtrlBase::DoGetSizeFromTextSize(int xlen, int ylen) const
 
     int fhei;
 
 
     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 defined(__WXMSW__) && !defined(__WXUNIVERSAL__)
+    fhei = EDIT_HEIGHT_FROM_CHAR_HEIGHT(GetCharHeight());
+#elif defined(__WXGTK__) && !defined(__WXUNIVERSAL__)
+    // Control creation is not entirely cheap, so cache the heights to
+    // avoid repeatedly creating dummy controls:
+    static wxString s_last_font;
+    static int s_last_fhei = -1;
+    wxString fontdesc;
     if ( m_font.IsOk() )
     if ( m_font.IsOk() )
-        cb->SetFont(m_font);
-    fhei = cb->GetBestSize().y;
-    cb->Destroy();
+        fontdesc = m_font.GetNativeFontInfoDesc();
+    if ( s_last_fhei != -1 && fontdesc == s_last_font )
+    {
+        fhei = s_last_fhei;
+    }
+    else
+    {
+        wxComboBox* cb = new wxComboBox;
+        cb->Hide();
+        cb->Create(const_cast<wxComboCtrlBase*>(this), wxID_ANY);
+        if ( m_font.IsOk() )
+            cb->SetFont(m_font);
+        s_last_font = fontdesc;
+        s_last_fhei = fhei = cb->GetBestSize().y;
+        cb->Destroy();
+    }
 #else
     if ( m_font.IsOk() )
         fhei = (m_font.GetPointSize()*2) + 5;
 #else
     if ( m_font.IsOk() )
         fhei = (m_font.GetPointSize()*2) + 5;