Example #1
0
        static void Main(string[] args)
        {
            DateTime           testDate, nextDate;
            HashSet <DateTime> holidayDates;
            DateTimeCollection recurDates;
            int yearFrom, yearTo, idx;

            if (args.Length != 2)
            {
                Console.WriteLine("Using current year +/- 4 years for testing\r\n");

                yearFrom = DateTime.Today.Year - 4;
                yearTo   = yearFrom + 8;
            }
            else
            {
                try
                {
                    yearFrom = Convert.ToInt32(args[0]);
                    yearTo   = Convert.ToInt32(args[1]);

                    if (yearFrom < 1)
                    {
                        yearFrom = 1;
                    }

                    if (yearFrom > 9999)
                    {
                        yearFrom = 9999;
                    }

                    if (yearTo < 1)
                    {
                        yearTo = 1;
                    }

                    if (yearTo > 9999)
                    {
                        yearTo = 9999;
                    }

                    if (yearFrom > yearTo)
                    {
                        idx      = yearFrom;
                        yearFrom = yearTo;
                        yearTo   = idx;
                    }
                }
                catch
                {
                    Console.WriteLine("Invalid year specified on command line");
                    return;
                }
            }

            // Test DateUtils.CalculateOccurrenceDate
            Console.WriteLine("Fourth weekday in January 2018: {0:d}",
                              DateUtils.CalculateOccurrenceDate(2018, 1, DayOccurrence.Fourth, DaysOfWeek.Weekdays, 0));

            Console.WriteLine("Fourth weekday in January 2018 + 2: {0:d}",
                              DateUtils.CalculateOccurrenceDate(2018, 1, DayOccurrence.Fourth, DaysOfWeek.Weekdays, 2));

            Console.WriteLine("Last weekend day in January 2018: {0:d}",
                              DateUtils.CalculateOccurrenceDate(2018, 1, DayOccurrence.Last, DaysOfWeek.Weekends, 0));

            Console.WriteLine("Last weekend day in January 2018 + 2: {0:d}",
                              DateUtils.CalculateOccurrenceDate(2018, 1, DayOccurrence.Last, DaysOfWeek.Weekends, 2));

            // Pause to review output
            Console.WriteLine("Press ENTER to continue");
            Console.ReadLine();

            // Test DateUtils.DateFromWeek(), DateUtils.WeeksInYear(), and DateUtils.WeekFromDate()
            DateTime weekFrom, weekTo;
            int      year;

            Console.WriteLine("Week start = Monday");
            DayOfWeek dow = DayOfWeek.Monday;

            for (year = yearFrom; year <= yearTo; year++)
            {
                for (idx = 1; idx < 54; idx++)
                {
                    if (idx != 53 || DateUtils.WeeksInYear(year, dow) == 53)
                    {
                        weekFrom = DateUtils.DateFromWeek(year, idx, dow, 0);
                        weekTo   = DateUtils.DateFromWeek(year, idx, dow, 6);

                        Console.WriteLine("{0} Week {1}: {2:d} - {3:d}  {4}", year, idx, weekFrom, weekTo,
                                          DateUtils.WeekFromDate(weekFrom.AddDays(3), dow));
                    }
                }

                // Pause to review output
                Console.WriteLine("Press ENTER to continue");
                Console.ReadLine();
            }

            // Test DateUtils.EasterSunday()
            Console.WriteLine("Easter - Gregorian");

            for (idx = yearFrom; idx <= yearTo; idx += 3)
            {
                testDate = DateUtils.EasterSunday(idx, EasterMethod.Gregorian);
                Console.Write("{0}    {1}/{2:00}            ", idx, testDate.Month, testDate.Day);

                testDate = DateUtils.EasterSunday(idx + 1, EasterMethod.Gregorian);
                Console.Write("{0}    {1}/{2:00}            ", idx + 1, testDate.Month, testDate.Day);

                testDate = DateUtils.EasterSunday(idx + 2, EasterMethod.Gregorian);
                Console.WriteLine("{0}    {1}/{2:00}", idx + 2, testDate.Month, testDate.Day);
            }

            Console.WriteLine("\nEaster - Julian");

            for (idx = yearFrom; idx <= yearTo; idx += 3)
            {
                testDate = DateUtils.EasterSunday(idx, EasterMethod.Julian);
                Console.Write("{0}    {1}/{2:00}            ", idx, testDate.Month, testDate.Day);

                testDate = DateUtils.EasterSunday(idx + 1, EasterMethod.Julian);
                Console.Write("{0}    {1}/{2:00}            ", idx + 1, testDate.Month, testDate.Day);

                testDate = DateUtils.EasterSunday(idx + 2, EasterMethod.Julian);
                Console.WriteLine("{0}    {1}/{2:00}", idx + 2, testDate.Month, testDate.Day);
            }

            Console.WriteLine("\nEaster - Orthodox");

            for (idx = yearFrom; idx <= yearTo; idx += 3)
            {
                testDate = DateUtils.EasterSunday(idx, EasterMethod.Orthodox);
                Console.Write("{0}    {1}/{2:00}            ", idx, testDate.Month, testDate.Day);

                testDate = DateUtils.EasterSunday(idx + 1, EasterMethod.Orthodox);
                Console.Write("{0}    {1}/{2:00}            ", idx + 1, testDate.Month, testDate.Day);

                testDate = DateUtils.EasterSunday(idx + 2, EasterMethod.Orthodox);
                Console.WriteLine("{0}    {1}/{2:00}", idx + 2, testDate.Month, testDate.Day);
            }

            // Pause to review output
            Console.WriteLine("Press ENTER to continue");
            Console.ReadLine();

            // Test DateUtils.FromISO8601String and DateUtils.FromISO8601TimeZone
            Console.WriteLine("Expressed in Universal Time");

            Console.WriteLine("20180314 = {0}", DateUtils.FromISO8601String("20180314", false));
            Console.WriteLine("20180314T10 = {0}", DateUtils.FromISO8601String("20180314T10", false));
            Console.WriteLine("20180314T1025 = {0}", DateUtils.FromISO8601String("20180314T1025", false));
            Console.WriteLine("20180314T102531 = {0}", DateUtils.FromISO8601String("20180314T102531", false));
            Console.WriteLine("20180314T102531.123 = {0:d} {0:HH:mm:ss.fff}",
                              DateUtils.FromISO8601String("20180314T102531.123", false));
            Console.WriteLine("20180314T102531.98Z = {0:d} {0:HH:mm:ss.fff}",
                              DateUtils.FromISO8601String("20180314T102531.98Z", false));
            Console.WriteLine("20180314T102531-04 = {0}", DateUtils.FromISO8601String("20180314T102531-04", false));
            Console.WriteLine("20180314T102531.123+0830 = {0}",
                              DateUtils.FromISO8601String("20180314T102531.123+0830", false));

            Console.WriteLine("\n2018-03-14 = {0}", DateUtils.FromISO8601String("2018-03-14", false));
            Console.WriteLine("2018-03-14T10 = {0}", DateUtils.FromISO8601String("2018-03-14T10", false));
            Console.WriteLine("2018-03-14T10:25 = {0}", DateUtils.FromISO8601String("2018-03-14T10:25", false));
            Console.WriteLine("2018-03-14T10:25:31 = {0}", DateUtils.FromISO8601String("2018-03-14T10:25:31", false));
            Console.WriteLine("2018-03-14T10:25:31.123 = {0:d} {0:HH:mm:ss.fff}",
                              DateUtils.FromISO8601String("2018-03-14T10:25:31.123", false));
            Console.WriteLine("2018-03-14T10:25:31.98Z = {0:d} {0:HH:mm:ss.fff}",
                              DateUtils.FromISO8601String("2018-03-14T10:25:31.98Z", false));
            Console.WriteLine("2018-03-14T10:25:31-04 = {0}",
                              DateUtils.FromISO8601String("2018-03-14T10:25:31-04", false));
            Console.WriteLine("2018-03-14T10:25:31+08:30 = {0}",
                              DateUtils.FromISO8601String("2018-03-14T10:25:31+08:30", false));

            // Test DateUtils.FromISO8601String and DateUtils.FromISO8601TimeZone
            Console.WriteLine("\nExpressed in Local Time");

            Console.WriteLine("20180314 = {0}", DateUtils.FromISO8601String("20180314", true));
            Console.WriteLine("20180314T10 = {0}", DateUtils.FromISO8601String("20180314T10", true));
            Console.WriteLine("20180314T1025 = {0}", DateUtils.FromISO8601String("20180314T1025", true));
            Console.WriteLine("20180314T102531 = {0}", DateUtils.FromISO8601String("20180314T102531", true));
            Console.WriteLine("20180314T102531.123 = {0:d} {0:HH:mm:ss.fff}",
                              DateUtils.FromISO8601String("20180314T102531.123", true));
            Console.WriteLine("20180314T102531.98Z = {0:d} {0:HH:mm:ss.fff}",
                              DateUtils.FromISO8601String("20180314T102531.98Z", true));
            Console.WriteLine("20180314T102531-04 = {0}", DateUtils.FromISO8601String("20180314T102531-04", true));
            Console.WriteLine("20180314T102531.123+0830 = {0}",
                              DateUtils.FromISO8601String("20180314T102531.123+0830", true));

            Console.WriteLine("\n2018-03-14 = {0}", DateUtils.FromISO8601String("2018-03-14", true));
            Console.WriteLine("2018-03-14T10 = {0}", DateUtils.FromISO8601String("2018-03-14T10", true));
            Console.WriteLine("2018-03-14T10:25 = {0}", DateUtils.FromISO8601String("2018-03-14T10:25", true));
            Console.WriteLine("2018-03-14T10:25:31 = {0}", DateUtils.FromISO8601String("2018-03-14T10:25:31", true));
            Console.WriteLine("2018-03-14T10:25:31.123 = {0:d} {0:HH:mm:ss.fff}",
                              DateUtils.FromISO8601String("2018-03-14T10:25:31.123", true));
            Console.WriteLine("2018-03-14T10:25:31.98Z = {0:d} {0:HH:mm:ss.fff}",
                              DateUtils.FromISO8601String("2018-03-14T10:25:31.98Z", true));
            Console.WriteLine("2018-03-14T10:25:31-04 = {0}",
                              DateUtils.FromISO8601String("2018-03-14T10:25:31-04", true));
            Console.WriteLine("2018-03-14T10:25:31+08:30 = {0}",
                              DateUtils.FromISO8601String("2018-03-14T10:25:31+08:30", true));

            TimeSpan ts = DateUtils.FromISO8601TimeZone("+08");

            Console.WriteLine("\n+08 = {0} hours {1} minutes", ts.Hours, ts.Minutes);

            ts = DateUtils.FromISO8601TimeZone("-08");

            Console.WriteLine("-08 = {0} hours {1} minutes", ts.Hours, ts.Minutes);

            ts = DateUtils.FromISO8601TimeZone("-0830");

            Console.WriteLine("-0830 = {0} hours {1} minutes", ts.Hours, ts.Minutes);

            ts = DateUtils.FromISO8601TimeZone("+08:30");

            Console.WriteLine("+08:30 = {0} hours {1} minutes", ts.Hours, ts.Minutes);

            // Restrict bad date part values to their minimum/maximum
            Console.WriteLine("\nBad date values test");

            Console.WriteLine("0000-01-01T10:25:00 = {0}",
                              DateUtils.FromISO8601String("0000-01-01T10:25:00", true));
            Console.WriteLine("0000-00-01T10:25:00 = {0}",
                              DateUtils.FromISO8601String("0000-00-01T10:25:00", true));
            Console.WriteLine("0000-13-01T10:25:00 = {0}",
                              DateUtils.FromISO8601String("0000-13-01T10:25:00", true));
            Console.WriteLine("0000-00-00T10:25:00 = {0}",
                              DateUtils.FromISO8601String("0000-00-00T10:25:00", true));
            Console.WriteLine("0000-00-32T10:25:00 = {0}",
                              DateUtils.FromISO8601String("0000-00-32T10:25:00", true));

            // Pause to review output
            Console.WriteLine("Press ENTER to continue");
            Console.ReadLine();

            // Test the Duration class
            Console.WriteLine("Assumptions: 1 year = {0} days, 1 month = {1} days\n", Duration.DaysInOneYear,
                              Duration.DaysInOneMonth);

            Duration d = new Duration("P1Y2M3W4DT5H6M7S");

            Console.WriteLine("P1Y2M3W4DT5H6M7S = {0}", d.ToString());
            Console.WriteLine("P1Y2M3W4DT5H6M7S = {0} (max units = months)", d.ToString(Duration.MaxUnit.Months));

            d = new Duration("P10Y11MT16M12S");

            Console.WriteLine("P10Y11MT16M12S = {0}", d.ToString());

            d = new Duration("P5M2DT16M");

            Console.WriteLine("P5M2DT16M = {0}", d.ToString());

            d = new Duration("P7W");

            Console.WriteLine("P7W = {0}", d.ToString());
            Console.WriteLine("P7W = {0} (max units = weeks)", d.ToString(Duration.MaxUnit.Weeks));
            Console.WriteLine("P7W = {0} (max units = days)", d.ToString(Duration.MaxUnit.Days));

            d = new Duration("P7W2D");

            Console.WriteLine("P7W2D = {0}", d.ToString());
            Console.WriteLine("P7W2D = {0} (max units = weeks)", d.ToString(Duration.MaxUnit.Weeks));
            Console.WriteLine("P7W2D = {0} (max units = days)", d.ToString(Duration.MaxUnit.Days));

            d = new Duration("P5DT2S");

            Console.WriteLine("P5DT2S = {0}", d.ToString());

            d = new Duration("PT24H");

            Console.WriteLine("PT24H = {0}", d.ToString());
            Console.WriteLine("PT24H = {0} (max units = hours)", d.ToString(Duration.MaxUnit.Hours));
            Console.WriteLine("PT24H = {0} (max units = minutes)", d.ToString(Duration.MaxUnit.Minutes));
            Console.WriteLine("PT24H = {0} (max units = seconds)", d.ToString(Duration.MaxUnit.Seconds));

            d = new Duration("PT24H3M2S");

            Console.WriteLine("PT24H3M2S = {0}", d.ToString());
            Console.WriteLine("PT24H3M2S = {0} (max units = hours)", d.ToString(Duration.MaxUnit.Hours));
            Console.WriteLine("PT24H3M2S = {0} (max units = minutes)", d.ToString(Duration.MaxUnit.Minutes));
            Console.WriteLine("PT24H3M2S = {0} (max units = seconds)", d.ToString(Duration.MaxUnit.Seconds));

            d = new Duration("PT1H10M20S");

            Console.WriteLine("PT1H10M20S = {0}", d.ToString());

            d = new Duration("PT5M20S");

            Console.WriteLine("PT5M20S = {0}", d.ToString());

            d = new Duration("PT5S");

            Console.WriteLine("PT5S = {0}", d.ToString());

            d = new Duration("P0Y0M0W0DT0H0M0S");

            Console.WriteLine("P0Y0M0W0DT0H0M0S = {0}", d.ToString());

            // Pause to review output
            Console.WriteLine("Press ENTER to continue");
            Console.ReadLine();

            d = new Duration("-P1Y2M3W4DT5H6M7S");

            Console.WriteLine("\n-P1Y2M3W4DT5H6M7S = {0}", d.ToString());
            Console.WriteLine("-P1Y2M3W4DT5H6M7S = {0} (max units = months)", d.ToString(Duration.MaxUnit.Months));

            d = new Duration("-P10Y11MT16M12S");

            Console.WriteLine("-P10Y11MT16M12S = {0}", d.ToString());

            d = new Duration("-P5M2DT16M");

            Console.WriteLine("-P5M2DT16M = {0}", d.ToString());

            d = new Duration("-P7W");

            Console.WriteLine("-P7W = {0}", d.ToString());
            Console.WriteLine("-P7W = {0} (max units = weeks)", d.ToString(Duration.MaxUnit.Weeks));
            Console.WriteLine("-P7W = {0} (max units = days)", d.ToString(Duration.MaxUnit.Days));

            d = new Duration("-P7W2D");

            Console.WriteLine("-P7W2D = {0}", d.ToString());
            Console.WriteLine("-P7W2D = {0} (max units = weeks)", d.ToString(Duration.MaxUnit.Weeks));
            Console.WriteLine("-P7W2D = {0} (max units = days)", d.ToString(Duration.MaxUnit.Days));

            d = new Duration("-P5DT2S");

            Console.WriteLine("-P5DT2S = {0}", d.ToString());

            d = new Duration("-PT24H");

            Console.WriteLine("-PT24H = {0}", d.ToString());
            Console.WriteLine("-PT24H = {0} (max units = hours)", d.ToString(Duration.MaxUnit.Hours));
            Console.WriteLine("-PT24H = {0} (max units = minutes)", d.ToString(Duration.MaxUnit.Minutes));
            Console.WriteLine("-PT24H = {0} (max units = seconds)", d.ToString(Duration.MaxUnit.Seconds));

            d = new Duration("-PT24H3M2S");

            Console.WriteLine("-PT24H3M2S = {0}", d.ToString());
            Console.WriteLine("-PT24H3M2S = {0} (max units = hours)", d.ToString(Duration.MaxUnit.Hours));
            Console.WriteLine("-PT24H3M2S = {0} (max units = minutes)", d.ToString(Duration.MaxUnit.Minutes));
            Console.WriteLine("-PT24H3M2S = {0} (max units = seconds)", d.ToString(Duration.MaxUnit.Seconds));

            d = new Duration("-PT1H10M20S");

            Console.WriteLine("-PT1H10M20S = {0}", d.ToString());

            d = new Duration("-PT5M20S");

            Console.WriteLine("-PT5M20S = {0}", d.ToString());

            d = new Duration("-PT5S");

            Console.WriteLine("-PT5S = {0}", d.ToString());

            d = new Duration("-P0Y0M0W0DT0H0M0S");

            Console.WriteLine("-P0Y0M0W0DT0H0M0S = {0}", d.ToString());

            // Pause to review output
            Console.WriteLine("Press ENTER to continue");
            Console.ReadLine();

            // Test the ToDescription() methods
            d = new Duration("P1Y2M3W4DT5H6M7S");

            Console.WriteLine("P1Y2M3W4DT5H6M7S = {0}", d.ToDescription());
            Console.WriteLine("P1Y2M3W4DT5H6M7S = {0} (max units = months)", d.ToDescription(Duration.MaxUnit.Months));

            d = new Duration("P10Y11MT16M12S");

            Console.WriteLine("P10Y11MT16M12S = {0}", d.ToDescription());

            d = new Duration("P5M2DT16M");

            Console.WriteLine("P5M2DT16M = {0}", d.ToDescription());

            d = new Duration("P7W");

            Console.WriteLine("P7W = {0}", d.ToDescription());
            Console.WriteLine("P7W = {0} (max units = weeks)", d.ToDescription(Duration.MaxUnit.Weeks));
            Console.WriteLine("P7W = {0} (max units = days)", d.ToDescription(Duration.MaxUnit.Days));

            d = new Duration("P7W2D");

            Console.WriteLine("P7W2D = {0}", d.ToDescription());
            Console.WriteLine("P7W2D = {0} (max units = weeks)", d.ToDescription(Duration.MaxUnit.Weeks));
            Console.WriteLine("P7W2D = {0} (max units = days)", d.ToDescription(Duration.MaxUnit.Days));

            d = new Duration("P5DT2S");

            Console.WriteLine("P5DT2S = {0}", d.ToDescription());

            d = new Duration("PT24H");

            Console.WriteLine("PT24H = {0}", d.ToDescription());
            Console.WriteLine("PT24H = {0} (max units = hours)", d.ToDescription(Duration.MaxUnit.Hours));
            Console.WriteLine("PT24H = {0} (max units = minutes)", d.ToDescription(Duration.MaxUnit.Minutes));
            Console.WriteLine("PT24H = {0} (max units = seconds)", d.ToDescription(Duration.MaxUnit.Seconds));

            d = new Duration("PT24H3M2S");

            Console.WriteLine("PT24H3M2S = {0}", d.ToDescription());
            Console.WriteLine("PT24H3M2S = {0} (max units = hours)", d.ToDescription(Duration.MaxUnit.Hours));
            Console.WriteLine("PT24H3M2S = {0} (max units = minutes)", d.ToDescription(Duration.MaxUnit.Minutes));
            Console.WriteLine("PT24H3M2S = {0} (max units = seconds)", d.ToDescription(Duration.MaxUnit.Seconds));

            d = new Duration("PT1H10M20S");

            Console.WriteLine("PT1H10M20S = {0}", d.ToDescription());

            d = new Duration("PT5M20S");

            Console.WriteLine("PT5M20S = {0}", d.ToDescription());

            d = new Duration("PT5S");

            Console.WriteLine("PT5S = {0}", d.ToDescription());

            d = new Duration("P0Y0M0W0DT0H0M0S");

            Console.WriteLine("P0Y0M0W0DT0H0M0S = {0}", d.ToDescription());

            // Pause to review output
            Console.WriteLine("Press ENTER to continue");
            Console.ReadLine();

            d = new Duration("-P1Y2M3W4DT5H6M7S");

            Console.WriteLine("\n-P1Y2M3W4DT5H6M7S = {0}", d.ToDescription());
            Console.WriteLine("-P1Y2M3W4DT5H6M7S = {0} (max units = months)", d.ToDescription(Duration.MaxUnit.Months));

            d = new Duration("-P10Y11MT16M12S");

            Console.WriteLine("-P10Y11MT16M12S = {0}", d.ToDescription());

            d = new Duration("-P5M2DT16M");

            Console.WriteLine("-P5M2DT16M = {0}", d.ToDescription());

            d = new Duration("-P7W");

            Console.WriteLine("-P7W = {0}", d.ToDescription());
            Console.WriteLine("-P7W = {0} (max units = weeks)", d.ToDescription(Duration.MaxUnit.Weeks));
            Console.WriteLine("-P7W = {0} (max units = days)", d.ToDescription(Duration.MaxUnit.Days));

            d = new Duration("-P7W2D");

            Console.WriteLine("-P7W2D = {0}", d.ToDescription());
            Console.WriteLine("-P7W2D = {0} (max units = weeks)", d.ToDescription(Duration.MaxUnit.Weeks));
            Console.WriteLine("-P7W2D = {0} (max units = days)", d.ToDescription(Duration.MaxUnit.Days));

            d = new Duration("-P5DT2S");

            Console.WriteLine("-P5DT2S = {0}", d.ToDescription());

            d = new Duration("-PT24H");

            Console.WriteLine("-PT24H = {0}", d.ToDescription());
            Console.WriteLine("-PT24H = {0} (max units = hours)", d.ToDescription(Duration.MaxUnit.Hours));
            Console.WriteLine("-PT24H = {0} (max units = minutes)", d.ToDescription(Duration.MaxUnit.Minutes));
            Console.WriteLine("-PT24H = {0} (max units = seconds)", d.ToDescription(Duration.MaxUnit.Seconds));

            d = new Duration("-PT24H3M2S");

            Console.WriteLine("-PT24H3M2S = {0}", d.ToDescription());
            Console.WriteLine("-PT24H3M2S = {0} (max units = hours)", d.ToDescription(Duration.MaxUnit.Hours));
            Console.WriteLine("-PT24H3M2S = {0} (max units = minutes)", d.ToDescription(Duration.MaxUnit.Minutes));
            Console.WriteLine("-PT24H3M2S = {0} (max units = seconds)", d.ToDescription(Duration.MaxUnit.Seconds));

            d = new Duration("-PT1H10M20S");

            Console.WriteLine("-PT1H10M20S = {0}", d.ToDescription());

            d = new Duration("-PT5M20S");

            Console.WriteLine("-PT5M20S = {0}", d.ToDescription());

            d = new Duration("-PT5S");

            Console.WriteLine("-PT5S = {0}", d.ToDescription());

            d = new Duration("-P0Y0M0W0DT0H0M0S");

            Console.WriteLine("-P0Y0M0W0DT0H0M0S = {0}", d.ToDescription());

            // Pause to review output
            Console.WriteLine("Press ENTER to continue");
            Console.ReadLine();

            // Create a set of fixed and floating holidays
            HolidayCollection holidays = new HolidayCollection();

            holidays.AddFixed(1, 1, true, "New Year's Day");
            holidays.AddFloating(DayOccurrence.Third, DayOfWeek.Monday, 1, 0, "Martin Luther King Day");
            holidays.AddFloating(DayOccurrence.Third, DayOfWeek.Monday, 2, 0, "President's Day");
            holidays.AddFloating(DayOccurrence.Last, DayOfWeek.Monday, 5, 0, "Memorial Day");
            holidays.AddFixed(7, 4, true, "Independence Day");
            holidays.AddFloating(DayOccurrence.First, DayOfWeek.Monday, 9, 0, "Labor Day");
            holidays.AddFixed(11, 11, true, "Veteran's Day");
            holidays.AddFloating(DayOccurrence.Fourth, DayOfWeek.Thursday, 11, 0, "Thanksgiving Day");
            holidays.AddFloating(DayOccurrence.Fourth, DayOfWeek.Thursday, 11, 1, "Day After Thanksgiving");
            holidays.AddFixed(12, 25, true, "Christmas Day");

            // Serialize the holidays to a file
            try
            {
                // XML
                using (var fs = new FileStream("Holidays.xml", FileMode.Create))
                {
                    XmlSerializer xs = new XmlSerializer(typeof(HolidayCollection));
                    xs.Serialize(fs, holidays);

                    Console.WriteLine("Holidays saved to Holidays.xml");
                }
#if NETFramework
                // The SOAP formatter is only supported on the full .NET Framework
                // SOAP
                using (var fs = new FileStream("Holidays.soap", FileMode.Create))
                {
                    var sf = new System.Runtime.Serialization.Formatters.Soap.SoapFormatter();

                    // SOAP doesn't support generics directly so use an array
                    sf.Serialize(fs, holidays.ToArray());

                    Console.WriteLine("Holidays saved to Holidays.soap");
                }
#endif
                // Binary
                using (var fs = new FileStream("Holidays.bin", FileMode.Create))
                {
                    BinaryFormatter bf = new BinaryFormatter();
                    bf.Serialize(fs, holidays);

                    Console.WriteLine("Holidays saved to Holidays.bin\n");
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Unable to save holidays:\n{0}", ex.Message);

                if (ex.InnerException != null)
                {
                    Console.WriteLine(ex.InnerException.Message);

                    if (ex.InnerException.InnerException != null)
                    {
                        Console.WriteLine(ex.InnerException.InnerException.Message);
                    }
                }
            }

            // Delete the collection and read it back in
            holidays = null;

            try
            {
                // XML
                using (var fs = new FileStream("Holidays.xml", FileMode.Open))
                {
                    XmlSerializer xs = new XmlSerializer(typeof(HolidayCollection));
                    holidays = (HolidayCollection)xs.Deserialize(fs);

                    Console.WriteLine("Holidays retrieved from Holidays.xml");
                }
#if NETFramework
                // SOAP
                using (var fs = new FileStream("Holidays.soap", FileMode.Open))
                {
                    var sf = new System.Runtime.Serialization.Formatters.Soap.SoapFormatter();

                    // As noted, SOAP doesn't support generics to an array is used instead
                    holidays = new HolidayCollection((Holiday[])sf.Deserialize(fs));

                    Console.WriteLine("Holidays retrieved from Holidays.soap");
                }
#endif
                // Binary
                using (var fs = new FileStream("Holidays.bin", FileMode.Open))
                {
                    BinaryFormatter bf = new BinaryFormatter();
                    holidays = (HolidayCollection)bf.Deserialize(fs);

                    Console.WriteLine("Holidays retrieved from Holidays.bin\n");
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Unable to load holidays:\n{0}", ex.Message);

                if (ex.InnerException != null)
                {
                    Console.WriteLine(ex.InnerException.Message);

                    if (ex.InnerException.InnerException != null)
                    {
                        Console.WriteLine(ex.InnerException.InnerException.Message);
                    }
                }
            }

            // Display the holidays added to the list
            Console.WriteLine("Holidays on file.  Is Holiday should be true for all.");

            foreach (Holiday hol in holidays)
            {
                Console.WriteLine("Holiday Date: {0:d}   Is Holiday: {1}  Description: {2}",
                                  hol.ToDateTime(yearFrom), holidays.IsHoliday(hol.ToDateTime(yearFrom)), hol.Description);
            }

            // Pause to review output
            Console.WriteLine("Press ENTER to continue");
            Console.ReadLine();

            // Display holidays found in each year specified using the IsHoliday method
            Console.WriteLine("Looking for holidays using the IsHoliday method");

            testDate = new DateTime(yearFrom, 1, 1);

            while (testDate.Year <= yearTo)
            {
                if (holidays.IsHoliday(testDate))
                {
                    Console.WriteLine("Found holiday: {0:d} {1}", testDate, holidays.HolidayDescription(testDate));
                }

                testDate = testDate.AddDays(1);

                // Stop after each year to review output
                if (testDate.Month == 1 && testDate.Day == 1)
                {
                    Console.WriteLine("Press ENTER to continue");
                    Console.ReadLine();
                }
            }

            // One more time, but use a hash set using the dates returned by the HolidaysBetween() method.  For
            // bulk comparisons, this is faster than the above procedure using the IsHoliday method.
            Console.WriteLine("Looking for holidays using HolidaysBetween");

            holidayDates = new HashSet <DateTime>(holidays.HolidaysBetween(yearFrom, yearTo));

            if (holidayDates.Count != 0)
            {
                testDate = new DateTime(yearFrom, 1, 1);

                while (testDate.Year <= yearTo)
                {
                    if (holidayDates.Contains(testDate))
                    {
                        Console.WriteLine("Found holiday: {0:d} {1}", testDate, holidays.HolidayDescription(testDate));
                    }

                    testDate = testDate.AddDays(1);

                    // Stop after each year to review output
                    if (testDate.Month == 1 && testDate.Day == 1)
                    {
                        Console.WriteLine("Press ENTER to continue");
                        Console.ReadLine();
                    }
                }
            }

            //=================================================================

            // Test recurrence
            Recurrence rRecur = new Recurrence();
            Recurrence.Holidays.AddRange(holidays);

            // Disallow occurrences on any of the defined holidays
            rRecur.CanOccurOnHoliday = false;

            testDate = new DateTime(yearFrom, 1, 1);

            // Test daily recurrence
            rRecur.StartDateTime = testDate;
            rRecur.RecurUntil    = testDate.AddMonths(1); // For the enumerator
            rRecur.RecurDaily(2);

            // Serialize the recurrence to a file
            try
            {
                // XML
                using (var fs = new FileStream("Recurrence.xml", FileMode.Create))
                {
                    XmlSerializer xs = new XmlSerializer(typeof(Recurrence));
                    xs.Serialize(fs, rRecur);

                    Console.WriteLine("Recurrence saved to Recurrence.xml");
                }
#if NETFramework
                // SOAP
                using (var fs = new FileStream("Recurrence.soap", FileMode.Create))
                {
                    var sf = new System.Runtime.Serialization.Formatters.Soap.SoapFormatter();
                    sf.Serialize(fs, rRecur);

                    Console.WriteLine("Recurrence saved to Recurrence.soap");
                }
#endif
                // Binary
                using (var fs = new FileStream("Recurrence.bin", FileMode.Create))
                {
                    BinaryFormatter bf = new BinaryFormatter();
                    bf.Serialize(fs, rRecur);

                    Console.WriteLine("Recurrence saved to Recurrence.bin\n");
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Unable to save recurrence:\n{0}", ex.Message);

                if (ex.InnerException != null)
                {
                    Console.WriteLine(ex.InnerException.Message);

                    if (ex.InnerException.InnerException != null)
                    {
                        Console.WriteLine(ex.InnerException.InnerException.Message);
                    }
                }
            }

            // Deserialize the recurrence from a file
            rRecur = null;

            try
            {
                // XML
                using (var fs = new FileStream("Recurrence.xml", FileMode.Open))
                {
                    XmlSerializer xs = new XmlSerializer(typeof(Recurrence));
                    rRecur = (Recurrence)xs.Deserialize(fs);

                    Console.WriteLine("Recurrence restored from Recurrence.xml");
                }
#if NETFramework
                // SOAP
                using (var fs = new FileStream("Recurrence.soap", FileMode.Open))
                {
                    var sf = new System.Runtime.Serialization.Formatters.Soap.SoapFormatter();
                    rRecur = (Recurrence)sf.Deserialize(fs);

                    Console.WriteLine("Recurrence retrieved from Recurrence.soap");
                }
#endif
                // Binary
                using (var fs = new FileStream("Recurrence.bin", FileMode.Open))
                {
                    BinaryFormatter bf = new BinaryFormatter();
                    rRecur = (Recurrence)bf.Deserialize(fs);

                    Console.WriteLine("Recurrence retrieved from Recurrence.bin\n");
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Unable to restore recurrence:\n{0}", ex.Message);

                if (ex.InnerException != null)
                {
                    Console.WriteLine(ex.InnerException.Message);

                    if (ex.InnerException.InnerException != null)
                    {
                        Console.WriteLine(ex.InnerException.InnerException.Message);
                    }
                }
            }

            recurDates = rRecur.InstancesBetween(testDate, testDate.AddMonths(1));

            Console.WriteLine(rRecur.ToStringWithStartDateTime());

            foreach (DateTime dt in recurDates)
            {
                Console.WriteLine("(Collection) Daily recurrence on: {0:d}", dt);
            }

            foreach (DateTime dt in rRecur)
            {
                Console.WriteLine("(Enumerator) Daily recurrence on: {0:d}", dt);
            }

            // Test NextInstance().  This isn't the most efficient way of searching for lots of dates but is
            // useful for one-off searches.
            nextDate = testDate;

            do
            {
                nextDate = rRecur.NextInstance(nextDate, false);

                if (nextDate != DateTime.MinValue)
                {
                    Console.WriteLine("(NextInstance) Daily recurrence on: {0:d}", nextDate);
                    nextDate = nextDate.AddMinutes(1);
                }
            } while(nextDate != DateTime.MinValue);

            // Pause to review output
            Console.WriteLine("Press ENTER to continue");
            Console.ReadLine();

            // Test weekly recurrence
            rRecur.StartDateTime = testDate;
            rRecur.RecurWeekly(1, DaysOfWeek.Monday | DaysOfWeek.Wednesday);
            recurDates = rRecur.InstancesBetween(testDate, testDate.AddMonths(1));

            Console.WriteLine(rRecur.ToStringWithStartDateTime());

            foreach (DateTime dt in recurDates)
            {
                Console.WriteLine("(Collection) Weekly recurrence on: {0:d}", dt);
            }

            foreach (DateTime dt in rRecur)
            {
                Console.WriteLine("(Enumerator) Weekly recurrence on: {0:d}", dt);
            }

            nextDate = testDate;

            do
            {
                nextDate = rRecur.NextInstance(nextDate, false);

                if (nextDate != DateTime.MinValue)
                {
                    Console.WriteLine("(NextInstance) Weekly recurrence on: {0:d}", nextDate);
                    nextDate = nextDate.AddMinutes(1);
                }
            } while(nextDate != DateTime.MinValue);

            // Pause to review output
            Console.WriteLine("Press ENTER to continue");
            Console.ReadLine();

            // Test monthly recurrence (option 1)
            rRecur.StartDateTime = testDate;
            rRecur.RecurUntil    = testDate.AddMonths(12); // For the enumerator
            rRecur.RecurMonthly(15, 2);
            recurDates = rRecur.InstancesBetween(testDate, testDate.AddMonths(12));

            Console.WriteLine(rRecur.ToStringWithStartDateTime());

            foreach (DateTime dt in recurDates)
            {
                Console.WriteLine("(Collection) Monthly recurrence on: {0:d}", dt);
            }

            foreach (DateTime dt in rRecur)
            {
                Console.WriteLine("(Enumerator) Monthly recurrence on: {0:d}", dt);
            }

            nextDate = testDate;

            do
            {
                nextDate = rRecur.NextInstance(nextDate, false);

                if (nextDate != DateTime.MinValue)
                {
                    Console.WriteLine("(NextInstance) Monthly recurrence on: {0:d}", nextDate);
                    nextDate = nextDate.AddMinutes(1);
                }
            } while(nextDate != DateTime.MinValue);

            // Pause to review output
            Console.WriteLine("Press ENTER to continue");
            Console.ReadLine();

            // Test monthly recurrence (option 2)
            rRecur.RecurMonthly(DayOccurrence.Third, DaysOfWeek.Thursday, 3);
            recurDates = rRecur.InstancesBetween(testDate, testDate.AddMonths(12));

            Console.WriteLine(rRecur.ToStringWithStartDateTime());

            foreach (DateTime dt in recurDates)
            {
                Console.WriteLine("(Collection) Monthly recurrence on: {0:d}", dt);
            }

            foreach (DateTime dt in rRecur)
            {
                Console.WriteLine("(Enumerator) Monthly recurrence on: {0:d}", dt);
            }

            nextDate = testDate;

            do
            {
                nextDate = rRecur.NextInstance(nextDate, false);

                if (nextDate != DateTime.MinValue)
                {
                    Console.WriteLine("(NextInstance) Monthly recurrence on: {0:d}", nextDate);
                    nextDate = nextDate.AddMinutes(1);
                }
            } while(nextDate != DateTime.MinValue);

            // Pause to review output
            Console.WriteLine("Press ENTER to continue");
            Console.ReadLine();

            // Test monthly recurrence (option 3 - a variation of option 2)
            rRecur.RecurMonthly(DayOccurrence.Third, DaysOfWeek.Weekends, 2);
            recurDates = rRecur.InstancesBetween(testDate, testDate.AddMonths(12));

            Console.WriteLine(rRecur.ToStringWithStartDateTime());

            foreach (DateTime dt in recurDates)
            {
                Console.WriteLine("(Collection) Monthly recurrence on: {0:d}", dt);
            }

            foreach (DateTime dt in rRecur)
            {
                Console.WriteLine("(Enumerator) Monthly recurrence on: {0:d}", dt);
            }

            nextDate = testDate;

            do
            {
                nextDate = rRecur.NextInstance(nextDate, false);

                if (nextDate != DateTime.MinValue)
                {
                    Console.WriteLine("(NextInstance) Monthly recurrence on: {0:d}", nextDate);
                    nextDate = nextDate.AddMinutes(1);
                }
            } while(nextDate != DateTime.MinValue);

            // Pause to review output
            Console.WriteLine("Press ENTER to continue");
            Console.ReadLine();

            // Test yearly recurrence (option 1)
            rRecur.StartDateTime = testDate;
            rRecur.RecurUntil    = testDate.AddYears(5); // For the enumerator
            rRecur.RecurYearly(5, 24, 1);
            recurDates = rRecur.InstancesBetween(testDate, testDate.AddYears(5));

            Console.WriteLine(rRecur.ToStringWithStartDateTime());

            foreach (DateTime dt in recurDates)
            {
                Console.WriteLine("(Collection) Yearly recurrence on: {0:d}", dt);
            }

            foreach (DateTime dt in rRecur)
            {
                Console.WriteLine("(Enumerator) Yearly recurrence on: {0:d}", dt);
            }

            nextDate = testDate;

            do
            {
                nextDate = rRecur.NextInstance(nextDate, false);

                if (nextDate != DateTime.MinValue)
                {
                    Console.WriteLine("(NextInstance) Yearly recurrence on: {0:d}", nextDate);
                    nextDate = nextDate.AddMinutes(1);
                }
            } while(nextDate != DateTime.MinValue);

            // Pause to review output
            Console.WriteLine("Press ENTER to continue");
            Console.ReadLine();

            // Test yearly recurrence (option 2)
            rRecur.RecurYearly(DayOccurrence.Last, DaysOfWeek.Sunday, 9, 2);
            recurDates = rRecur.InstancesBetween(testDate, testDate.AddYears(5));

            Console.WriteLine(rRecur.ToStringWithStartDateTime());

            foreach (DateTime dt in recurDates)
            {
                Console.WriteLine("(Collection) Yearly recurrence on: {0:d}", dt);
            }

            foreach (DateTime dt in rRecur)
            {
                Console.WriteLine("(Enumerator) Yearly recurrence on: {0:d}", dt);
            }

            nextDate = testDate;

            do
            {
                nextDate = rRecur.NextInstance(nextDate, false);

                if (nextDate != DateTime.MinValue)
                {
                    Console.WriteLine("(NextInstance) Yearly recurrence on: {0:d}", nextDate);
                    nextDate = nextDate.AddMinutes(1);
                }
            } while(nextDate != DateTime.MinValue);

            // Pause to review output
            Console.WriteLine("Press ENTER to continue");
            Console.ReadLine();

            // Test yearly recurrence (option 3 - a variation of option 2)
            rRecur.RecurYearly(DayOccurrence.Last, DaysOfWeek.Weekdays, 7, 1);
            recurDates = rRecur.InstancesBetween(testDate, testDate.AddYears(5));

            Console.WriteLine(rRecur.ToStringWithStartDateTime());

            foreach (DateTime dt in recurDates)
            {
                Console.WriteLine("(Collection) Yearly recurrence on: {0:d}", dt);
            }

            foreach (DateTime dt in rRecur)
            {
                Console.WriteLine("(Enumerator) Yearly recurrence on: {0:d}", dt);
            }

            nextDate = testDate;

            do
            {
                nextDate = rRecur.NextInstance(nextDate, false);

                if (nextDate != DateTime.MinValue)
                {
                    Console.WriteLine("(NextInstance) Yearly recurrence on: {0:d}", nextDate);
                    nextDate = nextDate.AddMinutes(1);
                }
            } while(nextDate != DateTime.MinValue);

            // Pause to review output
            Console.WriteLine("Press ENTER to continue");
            Console.ReadLine();
        }
Example #2
0
        /// <summary>
        /// This is used to initialize the control with settings from an existing recurrence object
        /// </summary>
        /// <param name="recurrence">The recurrence from which to get the settings.  If null, it uses a default
        /// daily recurrence pattern.</param>
        public void SetRecurrence(Recurrence recurrence)
        {
            Recurrence r = new Recurrence();

            if (recurrence == null)
            {
                r.StartDateTime = DateTime.Today;
                r.RecurDaily(1);
            }
            else
            {
                r.Parse(recurrence.ToStringWithStartDateTime());
            }

            // If the given pattern is not available, set it to the next best pattern
            if (maxPattern < r.Frequency)
            {
                switch (maxPattern)
                {
                case RecurFrequency.Yearly:
                    r.RecurYearly(DateTime.Now.Month, DateTime.Now.Day, r.Interval);
                    break;

                case RecurFrequency.Monthly:
                    r.RecurMonthly(DateTime.Now.Day, r.Interval);
                    break;

                case RecurFrequency.Weekly:
                    r.RecurWeekly(r.Interval, DateUtils.ToDaysOfWeek(DateTime.Now.DayOfWeek));
                    break;

                case RecurFrequency.Daily:
                    r.RecurDaily(r.Interval);
                    break;

                case RecurFrequency.Hourly:
                    r.RecurDaily(r.Interval);
                    r.Frequency = RecurFrequency.Hourly;
                    break;

                default:
                    r.RecurDaily(r.Interval);
                    r.Frequency = RecurFrequency.Minutely;
                    break;
                }
            }

            switch (r.Frequency)
            {
            case RecurFrequency.Yearly:
                rbYearly.Checked = true;
                break;

            case RecurFrequency.Monthly:
                rbMonthly.Checked = true;
                break;

            case RecurFrequency.Weekly:
                rbWeekly.Checked = true;
                break;

            case RecurFrequency.Hourly:
                rbHourly.Checked = true;
                break;

            case RecurFrequency.Minutely:
                rbMinutely.Checked = true;
                break;

            case RecurFrequency.Secondly:
                rbSecondly.Checked = true;
                break;

            default:        // Daily or undefined
                rbDaily.Checked = true;
                break;
            }

            cboWeekStartDay.SelectedValue = r.WeekStart;
            dtpEndDate.Value     = DateTime.Today;
            udcOccurrences.Value = 1;

            // If not visible, this option is always on in the recurrence
            if (holidayVisible)
            {
                chkHolidays.Checked = r.CanOccurOnHoliday;
            }
            else
            {
                chkHolidays.Checked = true;
            }

            if (r.MaximumOccurrences != 0)
            {
                rbEndAfter.Checked   = true;
                udcOccurrences.Value = (r.MaximumOccurrences < 1000) ? r.MaximumOccurrences : 999;
            }
            else
            if (r.RecurUntil == DateTime.MaxValue)
            {
                rbNeverEnds.Checked = true;
            }
            else
            {
                rbEndByDate.Checked = true;
                dtpEndDate.Value    = r.RecurUntil;
            }

            // Set parameters in the sub-controls.  Set them all so that when the Advanced pane is hidden or
            // shown, it keeps them consistent when first opened.
            ucYearly.SetValues(r);
            ucMonthly.SetValues(r);
            ucWeekly.SetValues(r);
            ucDaily.SetValues(r);
            ucHourly.SetValues(r);
            ucMinutely.SetValues(r);
            ucSecondly.SetValues(r);
            ucAdvanced.SetValues(r);

            if (advancedVisible)
            {
                noCopy = true;
                chkAdvanced.Checked = r.IsAdvancedPattern;
                noCopy = false;
            }
        }
Example #3
0
        //=====================================================================

	    /// <summary>
        /// This method is overridden to generate the controls
	    /// </summary>
        protected override void CreateChildControls()
        {
            if(this.DesignMode)
                return;

            Assembly asm = Assembly.GetExecutingAssembly();
            StringBuilder sb = new StringBuilder(4096);

            if(rRecur == null)
            {
                rRecur = new Recurrence();
                rRecur.StartDateTime = DateTime.Today;
                rRecur.RecurDaily(1);
            }

            // For this control, JavaScript support is required
            if(this.Page.Request.Browser.EcmaScriptVersion.Major < 1)
            {
                this.Controls.Add(new LiteralControl(String.Format(CultureInfo.InvariantCulture,
                    "<div class='{0}'>The <strong>EWSoftware.PDI.Web.Controls.RecurrencePattern</strong> " +
                    "control requires that JavaScript be enabled in order to work correctly.</div>",
                    String.IsNullOrWhiteSpace(this.CssPanel) ? "EWS_RP_Panel" : this.CssPanel)));
                return;
            }

            using(var sr = new StreamReader(asm.GetManifestResourceStream(RecurrencePatternHtml +
              "RecurrencePattern.html")))
            {
                sb.Append(sr.ReadToEnd().Trim());
            }

            using(var sr = new StreamReader(asm.GetManifestResourceStream(RecurrencePatternHtml +
              "SecondlyPattern.html")))
            {
                sb.Replace("<@Secondly@>", sr.ReadToEnd().Trim());
            }

            using(var sr = new StreamReader(asm.GetManifestResourceStream(RecurrencePatternHtml +
              "MinutelyPattern.html")))
            {
                sb.Replace("<@Minutely@>", sr.ReadToEnd().Trim());
            }

            using(var sr = new StreamReader(asm.GetManifestResourceStream(RecurrencePatternHtml +
              "HourlyPattern.html")))
            {
                sb.Replace("<@Hourly@>", sr.ReadToEnd().Trim());
            }

            using(var sr = new StreamReader(asm.GetManifestResourceStream(RecurrencePatternHtml +
              "DailyPattern.html")))
            {
                sb.Replace("<@Daily@>", sr.ReadToEnd().Trim());
            }

            using(var sr = new StreamReader(asm.GetManifestResourceStream(RecurrencePatternHtml +
              "WeeklyPattern.html")))
            {
                sb.Replace("<@Weekly@>", sr.ReadToEnd().Trim());
            }

            using(var sr = new StreamReader(asm.GetManifestResourceStream(RecurrencePatternHtml +
              "MonthlyPattern.html")))
            {
                sb.Replace("<@Monthly@>", sr.ReadToEnd().Trim());
            }

            using(var sr = new StreamReader(asm.GetManifestResourceStream(RecurrencePatternHtml +
              "YearlyPattern.html")))
            {
                sb.Replace("<@Yearly@>", sr.ReadToEnd().Trim());
            }

            using(var sr = new StreamReader(asm.GetManifestResourceStream(RecurrencePatternHtml +
              "AdvancedPattern.html")))
            {
                sb.Replace("<@Advanced@>", sr.ReadToEnd().Trim());
            }

            // Set the ID for all contained HTML controls and method calls
            sb.Replace("@_", this.ID + "_");
            sb.Replace("@.", "RP_" + this.ID + ".");

            // Replace styles as needed
            if(!String.IsNullOrWhiteSpace(this.CssButton))
                sb.Replace("EWS_RP_Button", this.CssButton);

            if(!String.IsNullOrWhiteSpace(this.CssErrorMessage))
                sb.Replace("EWS_RP_ErrorMessage", this.CssErrorMessage);

            if(!String.IsNullOrWhiteSpace(this.CssInput))
                sb.Replace("EWS_RP_Input", this.CssInput);

            if(!String.IsNullOrWhiteSpace(this.CssPanelBody))
                sb.Replace("EWS_RP_PanelBody", this.CssPanelBody);

            if(!String.IsNullOrWhiteSpace(this.CssPanelHeading))
                sb.Replace("EWS_RP_PanelHeading", this.CssPanelHeading);

            if(!String.IsNullOrWhiteSpace(this.CssPanelTitle))
                sb.Replace("EWS_RP_PanelTitle", this.CssPanelTitle);

            // Do this after the others or it matches them too
            if(!String.IsNullOrWhiteSpace(this.CssPanel))
                sb.Replace("EWS_RP_Panel", this.CssPanel);

            if(!String.IsNullOrWhiteSpace(this.CssSelect))
                sb.Replace("EWS_RP_Select", this.CssSelect);

            // Add the default style sheet if needed.  Try to put it in the header. If not, just add it as a
            // child of this control.
            if(String.IsNullOrWhiteSpace(this.CssButton) || String.IsNullOrWhiteSpace(this.CssErrorMessage) ||
              String.IsNullOrWhiteSpace(this.CssInput) || String.IsNullOrWhiteSpace(this.CssPanel) ||
              String.IsNullOrWhiteSpace(this.CssPanelBody) || String.IsNullOrWhiteSpace(this.CssPanelHeading) ||
              String.IsNullOrWhiteSpace(this.CssPanelTitle) || String.IsNullOrWhiteSpace(this.CssSelect))
            {
                LiteralControl cssLink = new LiteralControl(String.Format(CultureInfo.InvariantCulture,
                    "<link rel=\"stylesheet\" type=\"text/css\" href=\"{0}\">",
                    this.Page.ClientScript.GetWebResourceUrl(typeof(RecurrencePattern),
                        RecurrencePattern.RecurrencePatternHtml + "RecurrenceStyle.css")));

                cssLink.ID = "EWS_RP_Stylesheet";

                if(this.Page != null && this.Page.Header != null && this.Page.Header.FindControl(cssLink.ID) == null)
                    this.Page.Header.Controls.Add(cssLink);
                else
                    this.Controls.Add(cssLink);
            }

            this.Controls.Add(new LiteralControl(sb.ToString()));

            // Add the validator if supported.  If not, use an OnSubmit function with a custom
            // Page_ClientValidate function for __doPostBack (added by OnPreRender).
            if(this.DetermineRenderUplevel)
            {
                validator = new CustomValidator();
                validator.ID = this.ID + "_Validator";
                validator.ClientValidationFunction = this.ID + "_Validate";
                validator.Display = ValidatorDisplay.None;
                validator.ErrorMessage = "The recurrence pattern is not valid";
                this.Controls.Add(validator);
            }
            else
                this.Page.ClientScript.RegisterOnSubmitStatement(typeof(RecurrencePattern), this.ID + "_Submit",
                    "return RP_" + this.ID + ".ValidateRecurrence();");

            this.Page.RegisterRequiresPostBack(this);
        }
Example #4
0
        //=====================================================================

        /// <summary>
        /// This is used to load the recurrence data for the control on post back
        /// </summary>
        /// <param name="postDataKey">The key identifier for the control</param>
        /// <param name="postCollection">The collection of values</param>
        /// <returns>True if the server control's state changes as a result of the postback; otherwise, false</returns>
        public bool LoadPostData(string postDataKey, NameValueCollection postCollection)
        {
            string[] options;
            string pattern = null;
            DaysOfWeek daysOfWeek = DaysOfWeek.None;
            int val;

            if(postCollection != null)
                pattern = postCollection[this.ID + "_Value"];

            if(!String.IsNullOrEmpty(pattern))
            {
                // Parse and load the recurrence
                rRecur = new Recurrence();
                options = pattern.Split('\xFF');

                // Parse the pattern options
                if(options[0] == "1")
                    this.ParseAdvancedOptions(options);
                else
                {
                    switch(options[1])
                    {
                        case "1":   // Yearly
                            if(options[2] == "0")
                            {
                                rRecur.RecurYearly(
                                    Convert.ToInt32(options[3], CultureInfo.InvariantCulture) + 1,
                                    Convert.ToInt32(options[4], CultureInfo.InvariantCulture),
                                    Convert.ToInt32(options[5], CultureInfo.InvariantCulture));
                            }
                            else
                            {
                                val = Convert.ToInt32(options[4], CultureInfo.InvariantCulture);

                                if(val < 7)
                                    daysOfWeek = DateUtils.ToDaysOfWeek((DayOfWeek)val);
                                else
                                    if(val == 7)
                                        daysOfWeek = DaysOfWeek.Weekdays;
                                    else
                                        if(val == 8)
                                            daysOfWeek = DaysOfWeek.Weekends;
                                        else
                                            daysOfWeek = DaysOfWeek.EveryDay;

                                val = Convert.ToInt32(options[3], CultureInfo.InvariantCulture) + 1;

                                rRecur.RecurYearly((DayOccurrence)val, daysOfWeek,
                                    Convert.ToInt32(options[5], CultureInfo.InvariantCulture) + 1,
                                    Convert.ToInt32(options[6], CultureInfo.InvariantCulture));
                            }
                            break;

                        case "2":   // Monthly
                            if(options[2] == "0")
                            {
                                rRecur.RecurMonthly(
                                    Convert.ToInt32(options[3], CultureInfo.InvariantCulture),
                                    Convert.ToInt32(options[4], CultureInfo.InvariantCulture));
                            }
                            else
                            {
                                val = Convert.ToInt32(options[4], CultureInfo.InvariantCulture);

                                if(val < 7)
                                    daysOfWeek = DateUtils.ToDaysOfWeek((DayOfWeek)val);
                                else
                                    if(val == 7)
                                        daysOfWeek = DaysOfWeek.Weekdays;
                                    else
                                        if(val == 8)
                                            daysOfWeek = DaysOfWeek.Weekends;
                                        else
                                            daysOfWeek = DaysOfWeek.EveryDay;

                                val = Convert.ToInt32(options[3], CultureInfo.InvariantCulture) + 1;

                                rRecur.RecurMonthly((DayOccurrence)val, daysOfWeek, Convert.ToInt32(options[5],
                                    CultureInfo.InvariantCulture));
                            }
                            break;

                        case "3":   // Weekly
                            if(options[3][0] == '1')
                                daysOfWeek |= DaysOfWeek.Sunday;

                            if(options[3][1] == '1')
                                daysOfWeek |= DaysOfWeek.Monday;

                            if(options[3][2] == '1')
                                daysOfWeek |= DaysOfWeek.Tuesday;

                            if(options[3][3] == '1')
                                daysOfWeek |= DaysOfWeek.Wednesday;

                            if(options[3][4] == '1')
                                daysOfWeek |= DaysOfWeek.Thursday;

                            if(options[3][5] == '1')
                                daysOfWeek |= DaysOfWeek.Friday;

                            if(options[3][6] == '1')
                                daysOfWeek |= DaysOfWeek.Saturday;

                            rRecur.RecurWeekly(Convert.ToInt32(options[2], CultureInfo.InvariantCulture), daysOfWeek);
                            break;

                        case "4":   // Daily
                            if(options[2] == "1")
                            {
                                // Every week day
                                rRecur.Frequency = RecurFrequency.Daily;
                                rRecur.Interval = 1;
                                rRecur.ByDay.AddRange(new [] { DayOfWeek.Monday, DayOfWeek.Tuesday,
                                    DayOfWeek.Wednesday, DayOfWeek.Thursday, DayOfWeek.Friday });
                            }
                            else
                                rRecur.RecurDaily(Convert.ToInt32(options[3], CultureInfo.InvariantCulture));
                            break;

                        default:    // Hourly, minutely, secondly
                            rRecur.Frequency = (RecurFrequency)Convert.ToInt32(options[1], CultureInfo.InvariantCulture);
                            rRecur.Interval = Convert.ToInt32(options[2], CultureInfo.InvariantCulture);
                            break;
                    }
                }

                // Parse the range options
                rRecur.WeekStart = (DayOfWeek)Convert.ToInt32(options[options.Length - 4], CultureInfo.InvariantCulture);
                rRecur.CanOccurOnHoliday = (options[options.Length - 3] == "1");

                switch(options[options.Length - 2])
                {
                    case "1":   // End after N occurrences
                        rRecur.MaximumOccurrences = Convert.ToInt32(options[options.Length - 1],
                            CultureInfo.InvariantCulture);
                        break;

                    case "2":   // End after a specific date
                        rRecur.RecurUntil = Convert.ToDateTime(options[options.Length - 1],
                            CultureInfo.InvariantCulture);
                        break;

                    default:    // Never ends
                        break;
                }
            }

            return false;
        }
Example #5
0
        /// <summary>
        /// This is used to initialize the control with settings from an existing recurrence object
        /// </summary>
        /// <param name="recurrence">The recurrence from which to get the settings.  If null, it uses a default daily
        /// recurrence pattern.</param>
        public void SetRecurrence(Recurrence recurrence)
        {
            rRecur = new Recurrence();

            if(recurrence == null)
            {
                rRecur.StartDateTime = DateTime.Today;
                rRecur.RecurDaily(1);
            }
            else
            {
                rRecur.Parse(recurrence.ToStringWithStartDateTime());

                // Reset to daily if undefined
                if(rRecur.Frequency == RecurFrequency.Undefined)
                    rRecur.RecurDaily(rRecur.Interval);
            }

            // If the given pattern is not available, set it to the next best pattern
            if(this.MaximumPattern < rRecur.Frequency)
                switch(this.MaximumPattern)
                {
                    case RecurFrequency.Yearly:
                        rRecur.RecurYearly(DateTime.Now.Month, DateTime.Now.Day, rRecur.Interval);
                        break;

                    case RecurFrequency.Monthly:
                        rRecur.RecurMonthly(DateTime.Now.Day, rRecur.Interval);
                        break;

                    case RecurFrequency.Weekly:
                        rRecur.RecurWeekly(rRecur.Interval, DateUtils.ToDaysOfWeek(DateTime.Now.DayOfWeek));
                        break;

                    case RecurFrequency.Daily:
                        rRecur.RecurDaily(rRecur.Interval);
                        break;

                    case RecurFrequency.Hourly:
                        rRecur.RecurDaily(rRecur.Interval);
                        rRecur.Frequency = RecurFrequency.Hourly;
                        break;

                    default:
                        rRecur.RecurDaily(rRecur.Interval);
                        rRecur.Frequency = RecurFrequency.Minutely;
                        break;
                }
        }
Example #6
0
        /// <summary>
        /// This is used to initialize the control with settings from an existing recurrence object
        /// </summary>
        /// <param name="recurrence">The recurrence from which to get the settings.  If null, it uses a default
        /// daily recurrence pattern.</param>
        public void SetRecurrence(Recurrence recurrence)
        {
            Recurrence r = new Recurrence();

            if(recurrence == null)
            {
                r.StartDateTime = DateTime.Today;
                r.RecurDaily(1);
            }
            else
                r.Parse(recurrence.ToStringWithStartDateTime());

            // If the given pattern is not available, set it to the next best pattern
            if(maxPattern < r.Frequency)
                switch(maxPattern)
                {
                    case RecurFrequency.Yearly:
                        r.RecurYearly(DateTime.Now.Month, DateTime.Now.Day, r.Interval);
                        break;

                    case RecurFrequency.Monthly:
                        r.RecurMonthly(DateTime.Now.Day, r.Interval);
                        break;

                    case RecurFrequency.Weekly:
                        r.RecurWeekly(r.Interval, DateUtils.ToDaysOfWeek(DateTime.Now.DayOfWeek));
                        break;

                    case RecurFrequency.Daily:
                        r.RecurDaily(r.Interval);
                        break;

                    case RecurFrequency.Hourly:
                        r.RecurDaily(r.Interval);
                        r.Frequency = RecurFrequency.Hourly;
                        break;

                    default:
                        r.RecurDaily(r.Interval);
                        r.Frequency = RecurFrequency.Minutely;
                        break;
                }

            switch(r.Frequency)
            {
                case RecurFrequency.Yearly:
                    rbYearly.Checked = true;
                    break;

                case RecurFrequency.Monthly:
                    rbMonthly.Checked = true;
                    break;

                case RecurFrequency.Weekly:
                    rbWeekly.Checked = true;
                    break;

                case RecurFrequency.Hourly:
                    rbHourly.Checked = true;
                    break;

                case RecurFrequency.Minutely:
                    rbMinutely.Checked = true;
                    break;

                case RecurFrequency.Secondly:
                    rbSecondly.Checked = true;
                    break;

                default:    // Daily or undefined
                    rbDaily.Checked = true;
                    break;
            }

            cboWeekStartDay.SelectedValue = r.WeekStart;
            dtpEndDate.Value = DateTime.Today;
            udcOccurrences.Value = 1;

            // If not visible, this option is always on in the recurrence
            if(holidayVisible)
                chkHolidays.Checked = r.CanOccurOnHoliday;
            else
                chkHolidays.Checked = true;

            if(r.MaximumOccurrences != 0)
            {
                rbEndAfter.Checked = true;
                udcOccurrences.Value = (r.MaximumOccurrences < 1000) ? r.MaximumOccurrences : 999;
            }
            else
                if(r.RecurUntil == DateTime.MaxValue)
                    rbNeverEnds.Checked = true;
                else
                {
                    rbEndByDate.Checked = true;
                    dtpEndDate.Value = r.RecurUntil;
                }

            // Set parameters in the sub-controls.  Set them all so that when the Advanced pane is hidden or
            // shown, it keeps them consistent when first opened.
            ucYearly.SetValues(r);
            ucMonthly.SetValues(r);
            ucWeekly.SetValues(r);
            ucDaily.SetValues(r);
            ucHourly.SetValues(r);
            ucMinutely.SetValues(r);
            ucSecondly.SetValues(r);
            ucAdvanced.SetValues(r);

            if(advancedVisible)
            {
                noCopy = true;
                chkAdvanced.Checked = r.IsAdvancedPattern;
                noCopy = false;
            }
        }