// wxCalendarCtrl creation
// ----------------------------------------------------------------------------
+void wxCalendarCtrl::Init()
+{
+ m_marks =
+ m_holidays = 0;
+}
+
bool
wxCalendarCtrl::Create(wxWindow *parent,
wxWindowID id,
SetDate(dt.IsValid() ? dt : wxDateTime::Today());
- UpdateMarks();
+ if ( SetHolidayAttrs() )
+ UpdateMarks();
Connect(wxEVT_LEFT_DOWN,
wxMouseEventHandler(wxCalendarCtrl::MSWOnClick));
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) )
{
// 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;
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;