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:
Vadim Zeitlin
2008-02-16 15:39:06 +00:00
parent 7c16b7cc5d
commit 2fda1fe5fd
2 changed files with 37 additions and 37 deletions

View File

@@ -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;

View File

@@ -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;
}
// ----------------------------------------------------------------------------