private void OnRepeatOnRelativeDayInMonthChanged(eRelativeDayInMonth oldValue, eRelativeDayInMonth newValue)
 {
     OnPropertyChanged(new PropertyChangedEventArgs("RepeatOnRelativeDayInMonth"));
 }
Example #2
0
        /// <summary>
        /// AddRRuleByDay
        /// </summary>
        /// <param name="sb"></param>
        /// <param name="rday"></param>
        /// <param name="dow"></param>
        private void AddRRuleByDay(StringBuilder sb, eRelativeDayInMonth rday, DayOfWeek dow)
        {
            sb.Append(";BYDAY=");

            switch (rday)
            {
                case eRelativeDayInMonth.First:
                    sb.Append("1");
                    break;

                case eRelativeDayInMonth.Second:
                    sb.Append("2");
                    break;

                case eRelativeDayInMonth.Third:
                    sb.Append("3");
                    break;

                case eRelativeDayInMonth.Fourth:
                    sb.Append("4");
                    break;

                case eRelativeDayInMonth.Last:
                    sb.Append("-1");
                    break;
            }

            switch (dow)
            {
                case DayOfWeek.Sunday:
                    sb.Append("SU");
                    break;

                case DayOfWeek.Monday:
                    sb.Append("MO");
                    break;

                case DayOfWeek.Tuesday:
                    sb.Append("TU");
                    break;

                case DayOfWeek.Wednesday:
                    sb.Append("WE");
                    break;

                case DayOfWeek.Thursday:
                    sb.Append("TH");
                    break;

                case DayOfWeek.Friday:
                    sb.Append("FR");
                    break;

                default:
                    sb.Append("SA");
                    break;
            }
        }
        private static DateTime GetNextMonthlyRecurrence(DateTime startDate, eRelativeDayInMonth repeatOnRelativeDayInMonth, DayOfWeek relativeDayOfWeek, int repeatOnDayOfMonth, eMonthRecurrence repeatOnMonths)
        {
            Calendar cal = GetCalendar();

            if (repeatOnRelativeDayInMonth == eRelativeDayInMonth.None)
            {
                DateTime dt = startDate.AddDays(cal.GetDaysInMonth(startDate.Year, startDate.Month) - startDate.Day + 1);
                if (repeatOnMonths != eMonthRecurrence.All) AdjustForRepeatOnMonths(ref dt, repeatOnMonths); // Adjust for repeat on Months
                return dt.AddDays(Math.Min(cal.GetDaysInMonth(dt.Year, dt.Month), repeatOnDayOfMonth) - 1);
            }
            else
            {
                if (repeatOnRelativeDayInMonth == eRelativeDayInMonth.First)
                {
                    DateTime dt = startDate.AddDays(cal.GetDaysInMonth(startDate.Year, startDate.Month) - startDate.Day + 1);
                    if (repeatOnMonths != eMonthRecurrence.All) AdjustForRepeatOnMonths(ref dt, repeatOnMonths); // Adjust for repeat on Months
                    while (dt.DayOfWeek != relativeDayOfWeek)
                        dt = dt.AddDays(1);
                    return dt;
                }
                else if (repeatOnRelativeDayInMonth == eRelativeDayInMonth.Last)
                {
                    DateTime dt = startDate.AddDays(cal.GetDaysInMonth(startDate.Year, startDate.Month) - startDate.Day + 1);
                    if (repeatOnMonths != eMonthRecurrence.All) AdjustForRepeatOnMonths(ref dt, repeatOnMonths); // Adjust for repeat on Months
                    dt = dt.AddDays(cal.GetDaysInMonth(dt.Year, dt.Month) - 1);
                    while (dt.DayOfWeek != relativeDayOfWeek)
                        dt = dt.AddDays(-1);
                    return dt;
                }
                else
                {
                    // Second, third and forth
                    int relCount = 2;
                    if (repeatOnRelativeDayInMonth == eRelativeDayInMonth.Third)
                        relCount = 3;
                    else if (repeatOnRelativeDayInMonth == eRelativeDayInMonth.Fourth)
                        relCount = 4;
                    DateTime dt = startDate.AddDays(cal.GetDaysInMonth(startDate.Year, startDate.Month) - startDate.Day);
                    if (repeatOnMonths != eMonthRecurrence.All) AdjustForRepeatOnMonths(ref dt, repeatOnMonths); // Adjust for repeat on Months
                    while (relCount > 0)
                    {
                        dt = dt.AddDays(1);
                        if (dt.DayOfWeek == relativeDayOfWeek)
                            relCount--;
                    }
                    return dt;
                }
            }
            throw new InvalidOperationException("Could not find the next relative date for monthly recurrence starting on " + startDate.ToString() + " RelativeDayInMonth=" + repeatOnRelativeDayInMonth.ToString() + " RelativeDayOfWeek=" + relativeDayOfWeek.ToString());
        }