Don't construct invalid wxDateTime in GTK calendar control callbacks.

GTK+ may momentarily return invalid date when switching the month in the
calendar control. Check for this and adjust the date ourselves to make it
valid if necessary in order to avoid the asserts from wxDateTime ctor.

Closes #13224.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@67759 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin 2011-05-17 22:12:35 +00:00
parent 473d0f930e
commit 8ea26eedce

View File

@ -162,9 +162,22 @@ bool wxGtkCalendarCtrl::SetDate(const wxDateTime& date)
wxDateTime wxGtkCalendarCtrl::GetDate() const
{
guint year, month, day;
gtk_calendar_get_date(GTK_CALENDAR(m_widget), &year, &month, &day);
return wxDateTime(day, (wxDateTime::Month) month, year);
guint year, monthGTK, day;
gtk_calendar_get_date(GTK_CALENDAR(m_widget), &year, &monthGTK, &day);
// GTK may return an invalid date, this happens at least when switching the
// month (or the year in case of February in a leap year) and the new month
// has fewer days than the currently selected one making the currently
// selected day invalid, e.g. just choosing May 31 and going back a month
// results in the date being (non existent) April 31 when we're called from
// gtk_prev_month_callback(). We need to manually work around this to avoid
// asserts from wxDateTime ctor.
const wxDateTime::Month month = static_cast<wxDateTime::Month>(monthGTK);
const guint dayMax = wxDateTime::GetNumberOfDays(month, year);
if ( day > dayMax )
day = dayMax;
return wxDateTime(day, month, year);
}
void wxGtkCalendarCtrl::Mark(size_t day, bool mark)