X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/154014d68152d7dcca9ee08c593a3d89fc8fe488..5bf3b6fe48580853044132c381d3548535ca7ad1:/src/msw/calctrl.cpp?ds=sidebyside diff --git a/src/msw/calctrl.cpp b/src/msw/calctrl.cpp index 90faa55f47..842efa50c6 100644 --- a/src/msw/calctrl.cpp +++ b/src/msw/calctrl.cpp @@ -44,6 +44,12 @@ IMPLEMENT_DYNAMIC_CLASS(wxCalendarCtrl, wxControl) // wxCalendarCtrl creation // ---------------------------------------------------------------------------- +void wxCalendarCtrl::Init() +{ + m_marks = + m_holidays = 0; +} + bool wxCalendarCtrl::Create(wxWindow *parent, wxWindowID id, @@ -95,7 +101,8 @@ wxCalendarCtrl::Create(wxWindow *parent, SetDate(dt.IsValid() ? dt : wxDateTime::Today()); - UpdateMarks(); + if ( SetHolidayAttrs() ) + UpdateMarks(); Connect(wxEVT_LEFT_DOWN, wxMouseEventHandler(wxCalendarCtrl::MSWOnClick)); @@ -183,7 +190,7 @@ wxCalendarCtrl::HitTest(const wxPoint& pos, case MCHT_CALENDARDAY: if ( wd ) { - *wd = wx_static_cast(wxDateTime::WeekDay, hti.st.wDayOfWeek); + *wd = static_cast(hti.st.wDayOfWeek); } return wxCAL_HITTEST_HEADER; @@ -223,7 +230,7 @@ bool wxCalendarCtrl::SetDate(const wxDateTime& dt) wxDateTime wxCalendarCtrl::GetDate() const { -#ifdef __WXDEBUG__ +#if wxDEBUG_LEVEL SYSTEMTIME st; if ( !MonthCal_GetCurSel(GetHwnd(), &st) ) { @@ -235,7 +242,7 @@ wxDateTime wxCalendarCtrl::GetDate() const wxDateTime dt(st); wxASSERT_MSG( dt == m_date, "mismatch between data and control" ); -#endif // __WXDEBUG__ +#endif // wxDEBUG_LEVEL return m_date; } @@ -327,14 +334,30 @@ void wxCalendarCtrl::Mark(size_t day, bool mark) UpdateMarks(); } +void wxCalendarCtrl::SetHoliday(size_t day) +{ + wxCHECK_RET( day > 0 && day < 32, "invalid day" ); + + m_holidays |= 1 << (day - 1); +} + void wxCalendarCtrl::UpdateMarks() { - MONTHDAYSTATE states[3]; + // we show only one full month but there can be some days from the month + // before it and from the one after it so days from 3 different months can + // be partially shown + MONTHDAYSTATE states[3] = { 0 }; const int nMonths = MonthCal_GetMonthRange(GetHwnd(), GMR_DAYSTATE, NULL); - wxCHECK_RET( nMonths <= (int)WXSIZEOF(states), "unexpected months range" ); - for ( int i = 0; i < nMonths; i++ ) - states[i] = m_marks; + // although in principle the calendar might not show any days from the + // preceding months, it seems like it always does, consider e.g. Feb 2010 + // which starts on Monday and ends on Sunday and so could fit on 4 lines + // without showing any subsequent months -- the standard control still + // shows it on 6 lines and the number of visible months is still 3 + wxCHECK_RET( nMonths == (int)WXSIZEOF(states), "unexpected months range" ); + + // the fully visible month is the one in the middle + states[1] = m_marks | m_holidays; if ( !MonthCal_SetDayState(GetHwnd(), nMonths, states) ) { @@ -369,7 +392,13 @@ bool wxCalendarCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) // change anything -- filter it out if ( m_date != dateOld ) { - GenerateAllChangeEvents(dateOld); + if ( GenerateAllChangeEvents(dateOld) ) + { + // month changed, need to update the holidays if we use + // them + if ( SetHolidayAttrs() ) + UpdateMarks(); + } } } break; @@ -379,7 +408,7 @@ bool wxCalendarCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) const NMDAYSTATE * const ds = (NMDAYSTATE *)lParam; for ( int i = 0; i < ds->cDayState; i++ ) { - ds->prgDayState[i] = m_marks; + ds->prgDayState[i] = m_marks | m_holidays; } } break;