X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a9d13e15646f980ad5f2f90b98f090e23bd7a56d..cbc9145c04bd3ea0a228906c8363fa8f47e3acf9:/src/generic/datectlg.cpp?ds=sidebyside diff --git a/src/generic/datectlg.cpp b/src/generic/datectlg.cpp index a8f65fe981..ab5d7448d7 100644 --- a/src/generic/datectlg.cpp +++ b/src/generic/datectlg.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: generic/datectlg.cpp +// Name: src/generic/datectlg.cpp // Purpose: generic wxDatePickerCtrlGeneric implementation // Author: Andreas Pflug // Modified by: @@ -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 @@ -115,9 +128,8 @@ public: long style = 0, const wxValidator& validator = wxDefaultValidator); - virtual void DoMoveWindow(int x, int y, int w, int h); - protected: + virtual void DoMoveWindow(int x, int y, int w, int h); void OnSize(wxSizeEvent& event); void OnMouseEnter(wxMouseEvent& event); @@ -557,14 +569,18 @@ void wxDatePickerCtrlGeneric::DoMoveWindow(int x, int y, int w, int h) wxControl::DoMoveWindow(x, y, w, h); if (m_dropped) - DropDown(true); + DropDown(false); } wxSize wxDatePickerCtrlGeneric::DoGetBestSize() const { - int bh=m_btn->GetBestSize().y; - int eh=m_txt->GetBestSize().y; - return wxSize(DEFAULT_ITEM_WIDTH, bh > eh ? bh : eh); + if (m_btn && m_txt) + { + int bh=m_btn->GetBestSize().y; + int eh=m_txt->GetBestSize().y; + return wxSize(DEFAULT_ITEM_WIDTH, bh > eh ? bh : eh); + } + return wxControl::DoGetBestSize(); } @@ -620,14 +636,14 @@ wxDatePickerCtrlGeneric::SetDateRange(const wxDateTime& lowerdate, bool wxDatePickerCtrlGeneric::SetFormat(const wxChar *fmt) { + m_format.clear(); + wxDateTime dt; dt.ParseFormat(wxT("2003-10-13"), wxT("%Y-%m-%d")); - wxString str=dt.Format(fmt); - wxChar *p=(wxChar*)str.c_str(); - - m_format=wxEmptyString; + wxString str(dt.Format(fmt)); - while (*p) + const wxChar *p = str.c_str(); + while ( *p ) { int n=wxAtoi(p); if (n == dt.GetDay()) @@ -657,19 +673,19 @@ bool wxDatePickerCtrlGeneric::SetFormat(const wxChar *fmt) m_format.Append(*p++); } - if (m_txt) + if ( m_txt ) { wxArrayString allowedChars; for ( wxChar c = _T('0'); c <= _T('9'); c++ ) allowedChars.Add(wxString(c, 1)); - const wxChar *p = m_format.c_str(); - while (*p) + const wxChar *p2 = m_format.c_str(); + while ( *p2 ) { - if (*p == '%') - p += 2; + if ( *p2 == '%') + p2 += 2; else - allowedChars.Add(wxString(*p++, 1)); + allowedChars.Add(wxString(*p2++, 1)); } #if wxUSE_VALIDATORS @@ -694,20 +710,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; } @@ -715,7 +740,7 @@ bool wxDatePickerCtrlGeneric::GetRange(wxDateTime *dt1, wxDateTime *dt2) const { if (dt1) *dt1 = m_cal->GetLowerDateLimit(); - if (dt1) + if (dt2) *dt2 = m_cal->GetUpperDateLimit(); return true; } @@ -846,7 +871,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; @@ -879,6 +904,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); @@ -926,4 +957,3 @@ void wxDatePickerCtrlGeneric::OnCalKey(wxKeyEvent & ev) #endif // wxUSE_DATEPICKCTRL_GENERIC #endif // wxUSE_DATEPICKCTRL -