Ejemplo n.º 1
0
        /// <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);
        }
Ejemplo n.º 2
0
        /// <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);
            }
        }