X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/116d7e58056decdd150cff720ae30abf734935d9..931d6a47c32a5b4c283243cb553ce71ee2b535d5:/src/common/combocmn.cpp diff --git a/src/common/combocmn.cpp b/src/common/combocmn.cpp index c2f01598e2..82d1657960 100644 --- a/src/common/combocmn.cpp +++ b/src/common/combocmn.cpp @@ -4,7 +4,6 @@ // Author: Jaakko Salli // Modified by: // Created: Apr-30-2006 -// RCS-ID: $Id$ // Copyright: (c) 2005 Jaakko Salli // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -25,6 +24,10 @@ #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"; @@ -72,8 +75,8 @@ wxEND_FLAGS( wxComboBoxStyle ) wxIMPLEMENT_DYNAMIC_CLASS_XTI(wxComboBox, wxControl, "wx/combobox.h") wxBEGIN_PROPERTIES_TABLE(wxComboBox) -wxEVENT_PROPERTY( Select, wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEvent ) -wxEVENT_PROPERTY( TextEnter, wxEVT_COMMAND_TEXT_ENTER, wxCommandEvent ) +wxEVENT_PROPERTY( Select, wxEVT_COMBOBOX, wxCommandEvent ) +wxEVENT_PROPERTY( TextEnter, wxEVT_TEXT_ENTER, wxCommandEvent ) // TODO DELEGATES wxPROPERTY( Font, wxFont, SetFont, GetFont, wxEMPTY_PARAMETER_VALUE, \ @@ -389,7 +392,7 @@ void wxComboFrameEventHandler::OnIdle( wxIdleEvent& event ) wxWindow* popup = m_combo->GetPopupControl()->GetControl(); wxWindow* winpopup = m_combo->GetPopupWindow(); - if ( + if ( !winFocused || ( winFocused != m_focusStart && winFocused != popup && winFocused->GetParent() != popup && @@ -398,6 +401,7 @@ void wxComboFrameEventHandler::OnIdle( wxIdleEvent& event ) winFocused != m_combo && winFocused != m_combo->GetButton() // GTK (atleast) requires this ) + ) { m_combo->HidePopup(true); } @@ -1095,10 +1099,10 @@ wxComboCtrlBase::CreateTextCtrl(int style) // Connecting the events is currently the most reliable way wxWindowID id = m_text->GetId(); - m_text->Connect(id, wxEVT_COMMAND_TEXT_UPDATED, + m_text->Connect(id, wxEVT_TEXT, wxCommandEventHandler(wxComboCtrlBase::OnTextCtrlEvent), NULL, this); - m_text->Connect(id, wxEVT_COMMAND_TEXT_ENTER, + m_text->Connect(id, wxEVT_TEXT_ENTER, wxCommandEventHandler(wxComboCtrlBase::OnTextCtrlEvent), NULL, this); @@ -1370,15 +1374,31 @@ wxSize wxComboCtrlBase::DoGetSizeFromTextSize(int xlen, int ylen) const int fhei; -#if wxUSE_COMBOBOX && (defined(__WXMSW__) || defined(__WXGTK__)) \ - && !defined(__WXUNIVERSAL__) - wxComboBox* cb = new wxComboBox; - cb->Hide(); - cb->Create(const_cast(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() ) - 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(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; @@ -1787,7 +1807,7 @@ void wxComboCtrlBase::OnTextCtrlEvent(wxCommandEvent& event) return; } - if ( event.GetEventType() == wxEVT_COMMAND_TEXT_UPDATED ) + if ( event.GetEventType() == wxEVT_TEXT ) { if ( m_ignoreEvtText > 0 ) { @@ -2233,7 +2253,7 @@ void wxComboCtrlBase::OnButtonClick() void wxComboCtrlBase::Popup() { - wxCommandEvent event(wxEVT_COMMAND_COMBOBOX_DROPDOWN, GetId()); + wxCommandEvent event(wxEVT_COMBOBOX_DROPDOWN, GetId()); event.SetEventObject(this); HandleWindowEvent(event); @@ -2519,7 +2539,7 @@ void wxComboCtrlBase::OnPopupDismiss(bool generateEvent) if ( generateEvent ) { - wxCommandEvent event(wxEVT_COMMAND_COMBOBOX_CLOSEUP, GetId()); + wxCommandEvent event(wxEVT_COMBOBOX_CLOSEUP, GetId()); event.SetEventObject(this); HandleWindowEvent(event); }