/// <summary> /// Evaulates the RRule component, and adds each specified Period /// to the <see cref="Periods"/> collection. /// </summary> /// <param name="periodStart">The beginning date of the range to evaluate.</param> /// <param name="periodEnd">The end date of the range to evaluate.</param> virtual protected void EvaluateRRule(IDateTime referenceDate, DateTime periodStart, DateTime periodEnd, bool includeReferenceDateInResults) { // Handle RRULEs if (Recurrable.RecurrenceRules != null && Recurrable.RecurrenceRules.Count > 0) { foreach (IRecurrencePattern rrule in Recurrable.RecurrenceRules) { IEvaluator evaluator = rrule.GetService(typeof(IEvaluator)) as IEvaluator; if (evaluator != null) { IList <IPeriod> periods = evaluator.Evaluate(referenceDate, periodStart, periodEnd, includeReferenceDateInResults); foreach (IPeriod p in periods) { if (!Periods.Contains(p)) { Periods.Add(p); } } } } } else if (includeReferenceDateInResults) { // If no RRULEs were found, then we still need to add // the initial reference date to the results. IPeriod p = new Period(referenceDate.Copy <IDateTime>()); if (!Periods.Contains(p)) { Periods.Add(p); } } }
public void EvaluateToPreviousOccurrence(IDateTime completedDate, IDateTime currDt) { IDateTime beginningDate = completedDate.Copy<IDateTime>(); if (Todo.RecurrenceRules != null) { foreach (IRecurrencePattern rrule in Todo.RecurrenceRules) DetermineStartingRecurrence(rrule, ref beginningDate); } if (Todo.RecurrenceDates != null) { foreach (IPeriodList rdate in Todo.RecurrenceDates) DetermineStartingRecurrence(rdate, ref beginningDate); } if (Todo.ExceptionRules != null) { foreach (IRecurrencePattern exrule in Todo.ExceptionRules) DetermineStartingRecurrence(exrule, ref beginningDate); } if (Todo.ExceptionDates != null) { foreach (IPeriodList exdate in Todo.ExceptionDates) DetermineStartingRecurrence(exdate, ref beginningDate); } Evaluate(Todo.Start, DateUtil.GetSimpleDateTimeData(beginningDate), DateUtil.GetSimpleDateTimeData(currDt).AddTicks(1), true); }
/// <summary> /// Evaulates the RRule component, and adds each specified Period /// to the <see cref="Periods"/> collection. /// </summary> /// <param name="FromDate">The beginning date of the range to evaluate.</param> /// <param name="ToDate">The end date of the range to evaluate.</param> virtual protected void EvaluateRRule(IDateTime referenceDate, DateTime periodStart, DateTime periodEnd, bool includeReferenceDateInResults) { // Handle RRULEs if (Recurrable.RecurrenceRules != null && Recurrable.RecurrenceRules.Count > 0) { foreach (IRecurrencePattern rrule in Recurrable.RecurrenceRules) { IEvaluator evaluator = rrule.GetService(typeof(IEvaluator)) as IEvaluator; if (evaluator != null) { IList<IPeriod> periods = evaluator.Evaluate(referenceDate, periodStart, periodEnd, includeReferenceDateInResults); foreach (IPeriod p in periods) { if (!Periods.Contains(p)) Periods.Add(p); } } } } else if (includeReferenceDateInResults) { // If no RRULEs were found, then we still need to add // the initial reference date to the results. IPeriod p = new Period(referenceDate.Copy<IDateTime>()); if (!Periods.Contains(p)) Periods.Add(p); } }
public static IDateTime MatchTimeZone(IDateTime dt1, IDateTime dt2) { Debug.Assert(dt1 != null && dt2 != null); // Associate the date/time with the first. IDateTime copy = dt2.Copy <IDateTime>(); copy.AssociateWith(dt1); // If the dt1 time does not occur in the same time zone as the // dt2 time, then let's convert it so they can be used in the // same context (i.e. evaluation). if (dt1.TZID != null) { if (!string.Equals(dt1.TZID, copy.TZID)) { return((dt1.TimeZoneObservance != null) ? copy.ToTimeZone(dt1.TimeZoneObservance.Value) : copy.ToTimeZone(dt1.TZID)); } else { return(copy); } } else if (dt1.IsUniversalTime) { // The first date/time is in UTC time, convert! return(new iCalDateTime(copy.UTC)); } else { // The first date/time is in local time, convert! return(new iCalDateTime(copy.Local)); } }
/// <summary> /// Evaluates to previous occurrence. /// </summary> /// <param name="completedDate">The completed date.</param> /// <param name="currentDateTime">The current date time.</param> public void EvaluateToPreviousOccurrence(IDateTime completedDate, IDateTime currentDateTime) { var beginningDate = completedDate.Copy <IDateTime>( ); if (Todo.RecurrenceRules != null) { foreach (IRecurrencePattern rrule in Todo.RecurrenceRules) { DetermineStartingRecurrence(rrule, ref beginningDate); } } if (Todo.RecurrenceDates != null) { foreach (IPeriodList rdate in Todo.RecurrenceDates) { DetermineStartingRecurrence(rdate, ref beginningDate); } } if (Todo.ExceptionRules != null) { foreach (IRecurrencePattern exrule in Todo.ExceptionRules) { DetermineStartingRecurrence(exrule, ref beginningDate); } } if (Todo.ExceptionDates != null) { foreach (IPeriodList exdate in Todo.ExceptionDates) { DetermineStartingRecurrence(exdate, ref beginningDate); } } Evaluate(Todo.Start, DateUtil.GetSimpleDateTimeData(beginningDate), DateUtil.GetSimpleDateTimeData(currentDateTime).AddTicks(1), true); }
public static IDateTime MatchTimeZone(IDateTime dt1, IDateTime dt2) { Debug.Assert(dt1 != null && dt2 != null); // Associate the date/time with the first. IDateTime copy = dt2.Copy<IDateTime>(); copy.AssociateWith(dt1); // If the dt1 time does not occur in the same time zone as the // dt2 time, then let's convert it so they can be used in the // same context (i.e. evaluation). if (dt1.TZID != null) { if (!string.Equals(dt1.TZID, copy.TZID)) return (dt1.TimeZoneObservance != null) ? copy.ToTimeZone(dt1.TimeZoneObservance.Value) : copy.ToTimeZone(dt1.TZID); else return copy; } else if (dt1.IsUniversalTime) { // The first date/time is in UTC time, convert! return new iCalDateTime(copy.UTC); } else { // The first date/time is in local time, convert! return new iCalDateTime(copy.Local); } }
public static IDateTime MatchTimeZone(IDateTime dt1, IDateTime dt2) { // Associate the date/time with the first. var copy = dt2.Copy <IDateTime>(); copy.AssociateWith(dt1); // If the dt1 time does not occur in the same time zone as the // dt2 time, then let's convert it so they can be used in the // same context (i.e. evaluation). if (dt1.TzId != null) { if (!string.Equals(dt1.TzId, copy.TzId)) { return(copy.ToTimeZone(dt1.TzId)); } return(copy); } if (dt1.IsUniversalTime) { // The first date/time is in UTC time, convert! return(new CalDateTime(copy.AsUtc)); } // The first date/time is in local time, convert! return(new CalDateTime(copy.AsSystemLocal)); }
/// <summary> /// Handles the repetitions that occur from the <c>REPEAT</c> and /// <c>DURATION</c> properties. Each recurrence of the alarm will /// have its own set of generated repetitions. /// </summary> virtual protected void AddRepeatedItems() { if (Repeat != null) { int len = Occurrences.Count; for (int i = 0; i < len; i++) { AlarmOccurrence ao = Occurrences[i]; IDateTime alarmTime = ao.DateTime.Copy <IDateTime>(); for (int j = 0; j < Repeat; j++) { alarmTime = alarmTime.Add(Duration); Occurrences.Add(new AlarmOccurrence(this, alarmTime.Copy <IDateTime>(), ao.Component)); } } } }
/// <summary> /// Evaulates the RRule component, and adds each specified Period to the Periods collection. /// </summary> /// <param name="referenceDate"></param> /// <param name="periodStart">The beginning date of the range to evaluate.</param> /// <param name="periodEnd">The end date of the range to evaluate.</param> /// <param name="includeReferenceDateInResults"></param> virtual protected void EvaluateRRule(IDateTime referenceDate, DateTime periodStart, DateTime periodEnd, bool includeReferenceDateInResults) { // Handle RRULEs if (Recurrable.RecurrenceRules != null && Recurrable.RecurrenceRules.Count > 0) { foreach (var rrule in Recurrable.RecurrenceRules) { var evaluator = rrule.GetService(typeof(IEvaluator)) as IEvaluator; if (evaluator != null) { var periods = evaluator.Evaluate(referenceDate, periodStart, periodEnd, includeReferenceDateInResults); Periods.UnionWith(periods); } } } else if (includeReferenceDateInResults) { // If no RRULEs were found, then we still need to add // the initial reference date to the results. IPeriod p = new Period(referenceDate.Copy <IDateTime>()); Periods.UnionWith(new [] { p }); } }