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 // extra methods available only in this (generic) implementation
bool SetFormat(const wxString& fmt); bool SetFormat(const wxString& fmt);
wxCalendarCtrl *GetCalendar() const { return m_cal; } wxCalendarCtrl *GetCalendar() const;
// implementation only from now on // implementation only from now on
@@ -78,7 +78,6 @@ private:
void OnSize(wxSizeEvent& event); void OnSize(wxSizeEvent& event);
void OnFocus(wxFocusEvent& event); void OnFocus(wxFocusEvent& event);
wxCalendarCtrl *m_cal;
wxComboCtrl* m_combo; wxComboCtrl* m_combo;
wxCalendarComboPopup* m_popup; wxCalendarComboPopup* m_popup;

View File

@@ -167,12 +167,7 @@ public:
m_combo->SetText(wxEmptyString); m_combo->SetText(wxEmptyString);
} }
m_currentDate = date; SetDate(date);
}
const wxDateTime& GetDateValue() const
{
return m_currentDate;
} }
bool ParseDateTime(const wxString& s, wxDateTime* pDt) bool ParseDateTime(const wxString& s, wxDateTime* pDt)
@@ -217,39 +212,37 @@ private:
void OnSelChange(wxCalendarEvent &ev) void OnSelChange(wxCalendarEvent &ev)
{ {
m_currentDate = wxCalendarCtrl::GetDate(); m_combo->SetText(GetDate().Format(m_format));
m_combo->SetText(m_currentDate.Format(m_format));
if ( ev.GetEventType() == wxEVT_CALENDAR_DOUBLECLICKED ) if ( ev.GetEventType() == wxEVT_CALENDAR_DOUBLECLICKED )
{ {
Dismiss(); Dismiss();
} }
SendDateEvent(m_currentDate); SendDateEvent(GetDate());
} }
void OnKillTextFocus(wxFocusEvent &ev) void OnKillTextFocus(wxFocusEvent &ev)
{ {
ev.Skip(); ev.Skip();
const wxDateTime& dtOld = GetDate();
wxDateTime dt; wxDateTime dt;
wxString value = m_combo->GetValue(); wxString value = m_combo->GetValue();
if ( !ParseDateTime(value, &dt) ) if ( !ParseDateTime(value, &dt) )
{ {
if ( !HasDPFlag(wxDP_ALLOWNONE) ) if ( !HasDPFlag(wxDP_ALLOWNONE) )
dt = m_currentDate; dt = dtOld;
} }
if ( dt.IsValid() ) m_combo->SetText(GetStringValueFor(dt));
m_combo->SetText(dt.Format(m_format));
else
m_combo->SetText(wxEmptyString);
// notify that we had to change the date after validation // notify that we had to change the date after validation
if ( (dt.IsValid() && (!m_currentDate.IsValid() || m_currentDate != dt)) || if ( (dt.IsValid() && (!dtOld.IsValid() || dt != dtOld)) ||
(!dt.IsValid() && m_currentDate.IsValid()) ) (!dt.IsValid() && dtOld.IsValid()) )
{ {
m_currentDate = dt; SetDate(dt);
SendDateEvent(dt); SendDateEvent(dt);
} }
} }
@@ -319,8 +312,8 @@ private:
m_combo->SetValidator(tv); m_combo->SetValidator(tv);
#endif #endif
if (m_currentDate.IsValid()) if ( GetDate().IsValid() )
m_combo->SetText(m_currentDate.Format(m_format)); m_combo->SetText(GetDate().Format(m_format));
} }
return true; return true;
@@ -330,24 +323,31 @@ private:
{ {
wxDateTime dt; wxDateTime dt;
if ( ParseDateTime(s, &dt) ) if ( ParseDateTime(s, &dt) )
m_currentDate = dt; SetDate(dt);
else if ( HasDPFlag(wxDP_ALLOWNONE) ) else if ( HasDPFlag(wxDP_ALLOWNONE) )
m_currentDate = dt; SetDate(wxInvalidDateTime);
//else: !wxDP_ALLOWNONE, keep the old value
} }
virtual wxString GetStringValue() const virtual wxString GetStringValue() const
{ {
if ( !m_currentDate.IsValid() ) return GetStringValueFor(GetDate());
return wxEmptyString;
return m_currentDate.Format(m_format);
} }
private: 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; wxSize m_useSize;
wxString m_format; wxString m_format;
wxDateTime m_currentDate;
DECLARE_EVENT_TABLE() DECLARE_EVENT_TABLE()
}; };
@@ -415,8 +415,6 @@ bool wxDatePickerCtrlGeneric::Create(wxWindow *parent,
#endif #endif
m_combo->SetPopupControl(m_popup); m_combo->SetPopupControl(m_popup);
m_cal = m_popup;
m_popup->SetDateValue(date.IsValid() ? date : wxDateTime::Today()); m_popup->SetDateValue(date.IsValid() ? date : wxDateTime::Today());
SetInitialSize(size); SetInitialSize(size);
@@ -428,7 +426,6 @@ bool wxDatePickerCtrlGeneric::Create(wxWindow *parent,
void wxDatePickerCtrlGeneric::Init() void wxDatePickerCtrlGeneric::Init()
{ {
m_combo = NULL; m_combo = NULL;
m_cal = NULL;
m_popup = NULL; m_popup = NULL;
} }
@@ -442,7 +439,6 @@ bool wxDatePickerCtrlGeneric::Destroy()
m_combo->Destroy(); m_combo->Destroy();
m_combo = NULL; m_combo = NULL;
m_cal = NULL;
m_popup = NULL; m_popup = NULL;
return wxControl::Destroy(); return wxControl::Destroy();
@@ -465,13 +461,13 @@ bool
wxDatePickerCtrlGeneric::SetDateRange(const wxDateTime& lowerdate, wxDatePickerCtrlGeneric::SetDateRange(const wxDateTime& lowerdate,
const wxDateTime& upperdate) const wxDateTime& upperdate)
{ {
return m_cal->SetDateRange(lowerdate, upperdate); return m_popup->SetDateRange(lowerdate, upperdate);
} }
wxDateTime wxDatePickerCtrlGeneric::GetValue() const 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 bool wxDatePickerCtrlGeneric::GetRange(wxDateTime *dt1, wxDateTime *dt2) const
{ {
if (dt1) if (dt1)
*dt1 = m_cal->GetLowerDateLimit(); *dt1 = m_popup->GetLowerDateLimit();
if (dt2) if (dt2)
*dt2 = m_cal->GetUpperDateLimit(); *dt2 = m_popup->GetUpperDateLimit();
return true; return true;
} }
@@ -494,7 +490,12 @@ bool wxDatePickerCtrlGeneric::GetRange(wxDateTime *dt1, wxDateTime *dt2) const
void void
wxDatePickerCtrlGeneric::SetRange(const wxDateTime &dt1, const wxDateTime &dt2) 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;
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------