CodeImp.Gluon.AgendaManager.AddRecurringItem C# (CSharp) Method

AddRecurringItem() private method

private AddRecurringItem ( ICollection list, AgendaItem item, System.DateTime from, System.DateTime to ) : void
list ICollection
item AgendaItem
from System.DateTime
to System.DateTime
return void
        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;
                }
            }
        }