X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/caad76379f4870e2dd26e810270ab9e03302af65..0944fceb987def04dc89d03d58c35793d0ecdfed:/src/generic/datectlg.cpp?ds=inline diff --git a/src/generic/datectlg.cpp b/src/generic/datectlg.cpp index d2feb04557..2c2a33d58a 100644 --- a/src/generic/datectlg.cpp +++ b/src/generic/datectlg.cpp @@ -29,7 +29,8 @@ // use this version if we're explicitly requested to do it or if it's the only // one we have -#if wxUSE_DATEPICKCTRL_GENERIC || !defined(wxHAS_NATIVE_DATEPICKCTRL) +#if !defined(wxHAS_NATIVE_DATEPICKCTRL) || \ + (defined(wxUSE_DATEPICKCTRL_GENERIC) && wxUSE_DATEPICKCTRL_GENERIC) #ifndef WX_PRECOMP #include "wx/bmpbuttn.h" @@ -88,6 +89,18 @@ enum #define TXTPOSY 0 #endif +// ---------------------------------------------------------------------------- +// global variables +// ---------------------------------------------------------------------------- + +// this should have been a flag in wxDatePickerCtrlGeneric itself but adding it +// there now would break backwards compatibility, so put it here as a global: +// this shouldn't be a big problem as only one (GUI) thread normally can call +// wxDatePickerCtrlGeneric::SetValue() and so it can be only ever used for one +// control at a time +// +// if the value is not NULL, it points to the control which is inside SetValue() +static wxDatePickerCtrlGeneric *gs_inSetValue = NULL; // ---------------------------------------------------------------------------- // local classes @@ -521,6 +534,13 @@ void wxDatePickerCtrlGeneric::Init() m_ignoreDrop = false; } +wxDatePickerCtrlGeneric::~wxDatePickerCtrlGeneric() +{ + m_popup = NULL; + m_txt = NULL; + m_cal = NULL; + m_btn = NULL; +} bool wxDatePickerCtrlGeneric::Destroy() { @@ -687,20 +707,29 @@ wxDateTime wxDatePickerCtrlGeneric::GetValue() const void wxDatePickerCtrlGeneric::SetValue(const wxDateTime& date) { - if (m_cal) - { - if (date.IsValid()) - m_txt->SetValue(date.Format(m_format)); - else - { - wxASSERT_MSG( HasFlag(wxDP_ALLOWNONE), - _T("this control must have a valid date") ); + if ( !m_cal ) + return; - m_txt->SetValue(wxEmptyString); - } + // we need to suppress the event sent from wxTextCtrl as calling our + // SetValue() should not result in an event being sent (wxTextCtrl is + // an exception to this rule) + gs_inSetValue = this; + + if ( date.IsValid() ) + { + m_txt->SetValue(date.Format(m_format)); + } + else // invalid date + { + wxASSERT_MSG( HasFlag(wxDP_ALLOWNONE), + _T("this control must have a valid date") ); - m_currentDate = date; + m_txt->SetValue(wxEmptyString); } + + gs_inSetValue = NULL; + + m_currentDate = date; } @@ -820,6 +849,9 @@ void wxDatePickerCtrlGeneric::OnSetFocus(wxFocusEvent& WXUNUSED(ev)) void wxDatePickerCtrlGeneric::OnKillFocus(wxFocusEvent &ev) { + if (!m_txt) + return; + ev.Skip(); wxDateTime dt; @@ -836,7 +868,7 @@ void wxDatePickerCtrlGeneric::OnKillFocus(wxFocusEvent &ev) m_txt->SetValue(wxEmptyString); // notify that we had to change the date after validation - if ( (dt.IsValid() && m_currentDate != dt) || + if ( (dt.IsValid() && (!m_currentDate.IsValid() || m_currentDate != dt)) || (!dt.IsValid() && m_currentDate.IsValid()) ) { m_currentDate = dt; @@ -869,6 +901,12 @@ void wxDatePickerCtrlGeneric::OnSelChange(wxCalendarEvent &ev) void wxDatePickerCtrlGeneric::OnText(wxCommandEvent &ev) { + if ( gs_inSetValue ) + { + // artificial event resulting from our own SetValue() call, ignore it + return; + } + ev.SetEventObject(this); ev.SetId(GetId()); GetParent()->ProcessEvent(ev);