private void AddRecurringItem(ICollection<AgendaItem> list, AgendaItem item, DateTime from, DateTime to)
{
GregorianCalendar calendar = new GregorianCalendar();
TimeSpan alarmoffset = item.startdate - item.alarmdate;
DateTime d = from;
// Advance d to the first occurence of the item within this time period
switch(item.recur)
{
case AgendaItemRecur.Weekly:
if((int)d.DayOfWeek < (int)item.startdate.DayOfWeek)
d = d.AddDays((int)item.startdate.DayOfWeek - (int)d.DayOfWeek);
else if((int)d.DayOfWeek > (int)item.startdate.DayOfWeek)
d = d.AddDays((7 - (int)d.DayOfWeek) + (int)item.startdate.DayOfWeek);
break;
case AgendaItemRecur.Monthly:
if(d.Day < item.startdate.Day)
d = d.AddDays(item.startdate.Day - d.Day);
else if(d.Day > item.startdate.Day)
d = d.AddDays((calendar.GetDaysInMonth(d.Year, d.Month) - d.Day) + item.startdate.Day);
break;
case AgendaItemRecur.Annually:
// First advance to the correct day in the month
// so that we don't skip over the day when advancing by months
if(d.Day < item.startdate.Day)
d = d.AddDays(item.startdate.Day - d.Day);
else if(d.Day > item.startdate.Day)
d = d.AddDays((calendar.GetDaysInMonth(d.Year, d.Month) - d.Day) + item.startdate.Day);
// Now advance by months
if(d.Month < item.startdate.Month)
d = d.AddMonths(item.startdate.Month - d.Month);
else if(d.Month > item.startdate.Month)
d = d.AddMonths((12 - d.Month) + item.startdate.Month);
break;
}
// We check how many times we can repeat the item within the
// given timespan and add the item repeatedly
while(d.Ticks <= to.Ticks)
{
// Add item with proper dates
AgendaItem newitem = item;
newitem.startdate = d.AddHours(item.startdate.Hour).AddMinutes(item.startdate.Minute);
newitem.alarmdate = newitem.startdate.Subtract(alarmoffset);
TimeSpan span = newitem.startdate - newitem.originstartdate;
switch(item.recur)
{
case AgendaItemRecur.Weekly: newitem.recursions = (int)Math.Round(span.TotalDays / 7.0d); break;
case AgendaItemRecur.Monthly: newitem.recursions = (int)Math.Round(span.TotalDays / 30.4375d); break;
case AgendaItemRecur.Annually: newitem.recursions = (int)Math.Round(span.TotalDays / 365.25d); break;
}
list.Add(newitem);
// Advance date to the next date when the item recurs
switch(item.recur)
{
case AgendaItemRecur.Weekly:
d = d.AddDays(7);
break;
case AgendaItemRecur.Monthly:
//d = d.AddDays(calendar.GetDaysInMonth(d.Year, d.Month));
d = d.AddMonths(1);
break;
case AgendaItemRecur.Annually:
d = d.AddYears(1);
break;
}
}
}