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
|
// 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;
|
||||||
|
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
Reference in New Issue
Block a user