/// <summary> /// Calculate the NonWorking days for the range /// </summary> /// <param name="range"></param> private void CalculateNonWorkingDays(DoubleRange range) { var days = new string[] { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" }; NonWorkingDays = new List <string>(); if (double.IsNaN(range.Start)) { return; } var startDate = range.Start.FromOADate(); var endDate = range.End.FromOADate(); InternalWorkingDays = WorkingDays.ToString(); foreach (var day in days) { if (!InternalWorkingDays.Contains(day)) { NonWorkingDays.Add(day); } } nonWorkingHoursPerDay = 24 - (CloseTime - OpenTime); TotalNonWorkingHours = CalcNonWorkingHours(startDate, endDate, InternalWorkingDays, nonWorkingHoursPerDay); }
/// <summary> /// Calculates the visible range. /// </summary> protected internal override void CalculateVisibleRange(Size availableSize) { base.CalculateVisibleRange(availableSize); if (EnableBusinessHours) { var actualStart = ActualRange.Start.FromOADate(); var actualEnd = ActualRange.End.FromOADate(); // If actual range greater/less than business hours then change range start/end value as business range while (NonWorkingDays.Contains(actualStart.DayOfWeek.ToString())) { var date = actualStart.AddDays(-1); actualStart = date.AddHours(CloseTime == 24 ? 0 : CloseTime); } while (NonWorkingDays.Contains(actualEnd.DayOfWeek.ToString())) { var date = actualEnd.AddDays(-1); actualEnd = date.AddHours(CloseTime == 24 ? 0 : CloseTime); } if (actualStart.TimeOfDay.TotalHours < OpenTime) { actualStart = actualStart.AddHours(OpenTime - actualStart.TimeOfDay.TotalHours); } else if (actualStart.TimeOfDay.TotalHours > CloseTime) { actualStart = actualStart.AddHours(-(actualStart.TimeOfDay.TotalHours - CloseTime)); } if (actualEnd.TimeOfDay.TotalHours < OpenTime) { actualEnd = actualEnd.AddHours(OpenTime - actualEnd.TimeOfDay.TotalHours); } else if (actualEnd.TimeOfDay.TotalHours > CloseTime) { actualEnd = actualEnd.AddHours(-(actualEnd.TimeOfDay.TotalHours - CloseTime)); } if (ZoomPosition > 0 || ZoomFactor < 1) { var diff = CloseTime - OpenTime; // hours differce from endtime to open time var totalWorkingHours = CalcNonWorkingHours(actualStart, actualEnd, InternalWorkingDays.ToString(), nonWorkingHoursPerDay); var currentWorkingHours = ((ActualRange.Delta * 24) - totalWorkingHours) * ZoomPosition; // current working hours for zoom postion value var totalDays = currentWorkingHours / diff; // total days without nonworking hours var remainderHours = (totalDays - (int)totalDays); var startDate = actualStart.AddDays((int)totalDays).AddHours(remainderHours * diff); if (NonWorkingDays.Count > 0) { var weekEndCount = CalculateWeekEndDayCount(NonWorkingDays[0], actualStart, startDate); // find the weekend occurrence from start and end date startDate = startDate.AddDays(weekEndCount * NonWorkingDays.Count); while (NonWorkingDays.Contains(startDate.DayOfWeek.ToString())) { startDate = startDate.AddDays(1); } } var currentWorkingHours1 = ((ActualRange.Delta * 24) - totalWorkingHours) * ZoomFactor; // working hours for zoomfactor value var totalDays1 = currentWorkingHours1 / diff; var remainderHours1 = totalDays1 - (int)totalDays1; var endDate = startDate.AddDays((int)totalDays1); endDate = (remainderHours1 * diff) > (CloseTime - endDate.TimeOfDay.TotalHours) ? new DateTime(endDate.Year, endDate.Month, endDate.Day).AddDays(1).AddHours(OpenTime + ((remainderHours1 * diff) - (CloseTime - endDate.TimeOfDay.TotalHours))) : endDate.AddHours(remainderHours1 * diff); // calculate end date if (NonWorkingDays.Count > 0) { var weekEndCount = CalculateWeekEndDayCount(NonWorkingDays[0], startDate, endDate); endDate = endDate.AddDays(weekEndCount * NonWorkingDays.Count); while (NonWorkingDays.Contains(endDate.DayOfWeek.ToString())) { endDate = endDate.AddDays(1); } } VisibleRange = new DoubleRange(startDate.ToOADate(), endDate.ToOADate()); // set the visible range } else { VisibleRange = new DoubleRange(actualStart.ToOADate(), actualEnd.ToOADate()); } } DateTimeAxisHelper.CalculateVisibleRange(this, availableSize, Interval); if (EnableBusinessHours) { CalculateNonWorkingDays(VisibleRange); } }