fix redundant storage of current date both in wxCalendarCtrl (which was itself redundantly stored as both wxDatePickerCtrl::m_cal and m_popup) and popup m_currentDate variable which resulted in multiple bugs, e.g. calendar didn't open at the current date value
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@51843 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -59,7 +59,7 @@ public:
|
||||
|
||||
// extra methods available only in this (generic) implementation
|
||||
bool SetFormat(const wxString& fmt);
|
||||
wxCalendarCtrl *GetCalendar() const { return m_cal; }
|
||||
wxCalendarCtrl *GetCalendar() const;
|
||||
|
||||
|
||||
// implementation only from now on
|
||||
@@ -78,7 +78,6 @@ private:
|
||||
void OnSize(wxSizeEvent& event);
|
||||
void OnFocus(wxFocusEvent& event);
|
||||
|
||||
wxCalendarCtrl *m_cal;
|
||||
wxComboCtrl* m_combo;
|
||||
wxCalendarComboPopup* m_popup;
|
||||
|
||||
|
@@ -167,12 +167,7 @@ public:
|
||||
m_combo->SetText(wxEmptyString);
|
||||
}
|
||||
|
||||
m_currentDate = date;
|
||||
}
|
||||
|
||||
const wxDateTime& GetDateValue() const
|
||||
{
|
||||
return m_currentDate;
|
||||
SetDate(date);
|
||||
}
|
||||
|
||||
bool ParseDateTime(const wxString& s, wxDateTime* pDt)
|
||||
@@ -217,39 +212,37 @@ private:
|
||||
|
||||
void OnSelChange(wxCalendarEvent &ev)
|
||||
{
|
||||
m_currentDate = wxCalendarCtrl::GetDate();
|
||||
m_combo->SetText(m_currentDate.Format(m_format));
|
||||
m_combo->SetText(GetDate().Format(m_format));
|
||||
|
||||
if ( ev.GetEventType() == wxEVT_CALENDAR_DOUBLECLICKED )
|
||||
{
|
||||
Dismiss();
|
||||
}
|
||||
|
||||
SendDateEvent(m_currentDate);
|
||||
SendDateEvent(GetDate());
|
||||
}
|
||||
|
||||
void OnKillTextFocus(wxFocusEvent &ev)
|
||||
{
|
||||
ev.Skip();
|
||||
|
||||
const wxDateTime& dtOld = GetDate();
|
||||
|
||||
wxDateTime dt;
|
||||
wxString value = m_combo->GetValue();
|
||||
if ( !ParseDateTime(value, &dt) )
|
||||
{
|
||||
if ( !HasDPFlag(wxDP_ALLOWNONE) )
|
||||
dt = m_currentDate;
|
||||
dt = dtOld;
|
||||
}
|
||||
|
||||
if ( dt.IsValid() )
|
||||
m_combo->SetText(dt.Format(m_format));
|
||||
else
|
||||
m_combo->SetText(wxEmptyString);
|
||||
m_combo->SetText(GetStringValueFor(dt));
|
||||
|
||||
// notify that we had to change the date after validation
|
||||
if ( (dt.IsValid() && (!m_currentDate.IsValid() || m_currentDate != dt)) ||
|
||||
(!dt.IsValid() && m_currentDate.IsValid()) )
|
||||
if ( (dt.IsValid() && (!dtOld.IsValid() || dt != dtOld)) ||
|
||||
(!dt.IsValid() && dtOld.IsValid()) )
|
||||
{
|
||||
m_currentDate = dt;
|
||||
SetDate(dt);
|
||||
SendDateEvent(dt);
|
||||
}
|
||||
}
|
||||
@@ -319,8 +312,8 @@ private:
|
||||
m_combo->SetValidator(tv);
|
||||
#endif
|
||||
|
||||
if (m_currentDate.IsValid())
|
||||
m_combo->SetText(m_currentDate.Format(m_format));
|
||||
if ( GetDate().IsValid() )
|
||||
m_combo->SetText(GetDate().Format(m_format));
|
||||
}
|
||||
|
||||
return true;
|
||||
@@ -330,24 +323,31 @@ private:
|
||||
{
|
||||
wxDateTime dt;
|
||||
if ( ParseDateTime(s, &dt) )
|
||||
m_currentDate = dt;
|
||||
SetDate(dt);
|
||||
else if ( HasDPFlag(wxDP_ALLOWNONE) )
|
||||
m_currentDate = dt;
|
||||
SetDate(wxInvalidDateTime);
|
||||
//else: !wxDP_ALLOWNONE, keep the old value
|
||||
}
|
||||
|
||||
virtual wxString GetStringValue() const
|
||||
{
|
||||
if ( !m_currentDate.IsValid() )
|
||||
return wxEmptyString;
|
||||
|
||||
return m_currentDate.Format(m_format);
|
||||
return GetStringValueFor(GetDate());
|
||||
}
|
||||
|
||||
private:
|
||||
// returns either the given date representation using the current format or
|
||||
// an empty string if it's invalid
|
||||
wxString GetStringValueFor(const wxDateTime& dt) const
|
||||
{
|
||||
wxString val;
|
||||
if ( dt.IsValid() )
|
||||
val = dt.Format(m_format);
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
wxSize m_useSize;
|
||||
wxString m_format;
|
||||
wxDateTime m_currentDate;
|
||||
|
||||
DECLARE_EVENT_TABLE()
|
||||
};
|
||||
@@ -415,8 +415,6 @@ bool wxDatePickerCtrlGeneric::Create(wxWindow *parent,
|
||||
#endif
|
||||
m_combo->SetPopupControl(m_popup);
|
||||
|
||||
m_cal = m_popup;
|
||||
|
||||
m_popup->SetDateValue(date.IsValid() ? date : wxDateTime::Today());
|
||||
|
||||
SetInitialSize(size);
|
||||
@@ -428,7 +426,6 @@ bool wxDatePickerCtrlGeneric::Create(wxWindow *parent,
|
||||
void wxDatePickerCtrlGeneric::Init()
|
||||
{
|
||||
m_combo = NULL;
|
||||
m_cal = NULL;
|
||||
m_popup = NULL;
|
||||
}
|
||||
|
||||
@@ -442,7 +439,6 @@ bool wxDatePickerCtrlGeneric::Destroy()
|
||||
m_combo->Destroy();
|
||||
|
||||
m_combo = NULL;
|
||||
m_cal = NULL;
|
||||
m_popup = NULL;
|
||||
|
||||
return wxControl::Destroy();
|
||||
@@ -465,13 +461,13 @@ bool
|
||||
wxDatePickerCtrlGeneric::SetDateRange(const wxDateTime& lowerdate,
|
||||
const wxDateTime& upperdate)
|
||||
{
|
||||
return m_cal->SetDateRange(lowerdate, upperdate);
|
||||
return m_popup->SetDateRange(lowerdate, upperdate);
|
||||
}
|
||||
|
||||
|
||||
wxDateTime wxDatePickerCtrlGeneric::GetValue() const
|
||||
{
|
||||
return m_popup->GetDateValue();
|
||||
return m_popup->GetDate();
|
||||
}
|
||||
|
||||
|
||||
@@ -484,9 +480,9 @@ void wxDatePickerCtrlGeneric::SetValue(const wxDateTime& date)
|
||||
bool wxDatePickerCtrlGeneric::GetRange(wxDateTime *dt1, wxDateTime *dt2) const
|
||||
{
|
||||
if (dt1)
|
||||
*dt1 = m_cal->GetLowerDateLimit();
|
||||
*dt1 = m_popup->GetLowerDateLimit();
|
||||
if (dt2)
|
||||
*dt2 = m_cal->GetUpperDateLimit();
|
||||
*dt2 = m_popup->GetUpperDateLimit();
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -494,7 +490,12 @@ bool wxDatePickerCtrlGeneric::GetRange(wxDateTime *dt1, wxDateTime *dt2) const
|
||||
void
|
||||
wxDatePickerCtrlGeneric::SetRange(const wxDateTime &dt1, const wxDateTime &dt2)
|
||||
{
|
||||
m_cal->SetDateRange(dt1, dt2);
|
||||
m_popup->SetDateRange(dt1, dt2);
|
||||
}
|
||||
|
||||
wxCalendarCtrl *wxDatePickerCtrlGeneric::GetCalendar() const
|
||||
{
|
||||
return m_popup;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
Reference in New Issue
Block a user