X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/37424888b883ba2434066cfa559d3d96a5ac8723..1c6a98048b47cf1dd1926e97f94abe81a3fded1e:/src/common/combocmn.cpp diff --git a/src/common/combocmn.cpp b/src/common/combocmn.cpp index 2136fbd1cc..f1f60c697b 100644 --- a/src/common/combocmn.cpp +++ b/src/common/combocmn.cpp @@ -23,26 +23,11 @@ #pragma hdrstop #endif +#include "wx/combo.h" + #if wxUSE_COMBOBOX #include "wx/combobox.h" extern WXDLLEXPORT_DATA(const char) wxComboBoxNameStr[] = "comboBox"; -#endif - -#if wxUSE_COMBOCTRL - -#ifndef WX_PRECOMP - #include "wx/app.h" - #include "wx/log.h" - #include "wx/dcclient.h" - #include "wx/settings.h" - #include "wx/timer.h" - #include "wx/textctrl.h" -#endif - -#include "wx/tooltip.h" - -#include "wx/combo.h" - // ---------------------------------------------------------------------------- // XTI @@ -87,8 +72,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, \ @@ -110,6 +95,21 @@ wxEMPTY_HANDLERS_TABLE(wxComboBox) wxCONSTRUCTOR_5( wxComboBox, wxWindow*, Parent, wxWindowID, Id, \ wxString, Value, wxPoint, Position, wxSize, Size ) +#endif // wxUSE_COMBOBOX + +#if wxUSE_COMBOCTRL + +#ifndef WX_PRECOMP + #include "wx/app.h" + #include "wx/log.h" + #include "wx/dcclient.h" + #include "wx/settings.h" + #include "wx/timer.h" + #include "wx/textctrl.h" +#endif + +#include "wx/tooltip.h" + // constants // ---------------------------------------------------------------------------- @@ -389,7 +389,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 +398,7 @@ void wxComboFrameEventHandler::OnIdle( wxIdleEvent& event ) winFocused != m_combo && winFocused != m_combo->GetButton() // GTK (atleast) requires this ) + ) { m_combo->HidePopup(true); } @@ -489,9 +490,8 @@ bool wxComboPopupWindow::Show( bool show ) m_inShow++; - wxASSERT( IsKindOf(CLASSINFO(wxPopupTransientWindow)) ); - - wxPopupTransientWindow* ptw = (wxPopupTransientWindow*) this; + wxPopupTransientWindow* const + ptw = static_cast(this); if ( show != ptw->IsShown() ) { @@ -518,7 +518,7 @@ bool wxComboPopupWindow::ProcessLeftDown(wxMouseEvent& event) void wxComboPopupWindow::OnDismiss() { wxComboCtrlBase* combo = (wxComboCtrlBase*) GetParent(); - wxASSERT_MSG( combo->IsKindOf(CLASSINFO(wxComboCtrlBase)), + wxASSERT_MSG( wxDynamicCast(combo, wxComboCtrlBase), wxT("parent might not be wxComboCtrl, but check IMPLEMENT_DYNAMIC_CLASS(2) macro for correctness") ); combo->OnPopupDismiss(true); @@ -766,7 +766,7 @@ void wxComboBoxExtraInputHandler::OnFocus(wxFocusEvent& event) if ( m_combo->GetTextCtrl() ) m_combo->GetTextCtrl()->SelectAll(); else - m_combo->SetSelection(-1,-1); + m_combo->SelectAll(); } // Send focus indication to parent. @@ -1096,10 +1096,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); @@ -1360,20 +1360,34 @@ void wxComboCtrlBase::PositionTextCtrl( int textCtrlXAdjust, int textCtrlYAdjust 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(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; @@ -1393,11 +1407,6 @@ wxSize wxComboCtrlBase::DoGetBestSize() const fhei += 4; */ - // Final adjustments -#ifdef __WXGTK__ - fhei += 1; -#endif - #ifdef __WXMAC__ // these are the numbers from the HIG: switch ( m_windowVariant ) @@ -1416,11 +1425,19 @@ wxSize wxComboCtrlBase::DoGetBestSize() const #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 ) @@ -1771,7 +1788,7 @@ void wxComboCtrlBase::OnTextCtrlEvent(wxCommandEvent& event) return; } - if ( event.GetEventType() == wxEVT_COMMAND_TEXT_UPDATED ) + if ( event.GetEventType() == wxEVT_TEXT ) { if ( m_ignoreEvtText > 0 ) { @@ -2034,19 +2051,23 @@ void wxComboCtrlBase::OnCharEvent(wxKeyEvent& event) void wxComboCtrlBase::OnFocusEvent( wxFocusEvent& event ) { -// On Mac, this leads to infinite recursion and eventually a crash -#ifndef __WXMAC__ + // On Mac, setting focus here leads to infinite recursion and eventually + // a crash due to the SetFocus call producing another event. + // Handle Mac in OnIdleEvent using m_resetFocus. + if ( event.GetEventType() == wxEVT_SET_FOCUS ) { - wxWindow* tc = GetTextCtrl(); - if ( tc && tc != DoFindFocus() ) + if ( GetTextCtrl() && !GetTextCtrl()->HasFocus() ) { - tc->SetFocus(); +#ifdef __WXMAC__ + m_resetFocus = true; +#else + GetTextCtrl()->SetFocus(); +#endif } } - + Refresh(); -#endif } void wxComboCtrlBase::OnIdleEvent( wxIdleEvent& WXUNUSED(event) ) @@ -2054,9 +2075,8 @@ void wxComboCtrlBase::OnIdleEvent( wxIdleEvent& WXUNUSED(event) ) if ( m_resetFocus ) { m_resetFocus = false; - wxWindow* tc = GetTextCtrl(); - if ( tc ) - tc->SetFocus(); + if ( GetTextCtrl() ) + GetTextCtrl()->SetFocus(); } } @@ -2214,7 +2234,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); @@ -2500,7 +2520,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); }