Esempio n. 1
0
        /// <summary>
        /// Find matching ranges that contain timeToCheck
        /// </summary>
        /// <param name="timeToCheck"></param>
        /// <returns></returns>
        public IEnumerable <SlotTimeRange> MatchingRange(DateTime timeToCheck)
        {
            var returnValue = new List <SlotTimeRange>();

            returnValue.AddRange(TimeRanges.Where(x => x.BeginDate <= timeToCheck && x.EndDate >= timeToCheck));
            return(returnValue);
        }
Esempio n. 2
0
        /// <summary>
        /// Az adott időintervallumot hozzáadja a listában szereplőkhöz. Ha összeér, vagy belelóg egy vagy több már megjelölt időintervallumba, akkor összevonja az egybeérő időintervallumokat.
        /// </summary>
        public void AddTimeRange(TimeRange timeRange)
        {
            ReloadData();

            if (TimeUnit == TimeUnit.Infinity)
            {
                if (!TimeRanges.Any())
                {
                    AddTimeRangeToList(TaskControl_TimeRange.Infinity());
                }
            }
            else
            {
                var tcTimeRange = newTaskControl_TimeRange(timeRange.DateTimeStart, timeRange.DurationCount);

                /*var prev = TimeRanges.Where(x => x.DateTimeStart <= timeRange.DateTimeStart).OrderByDescending(x => x.DateTimeStart).FirstOrDefault();
                 * var next = TimeRanges.Where(x => x.DateTimeStart >= timeRange.DateTimeStart).OrderBy(x => x.DateTimeStart).FirstOrDefault();
                 * AddTimeRangeToList(timeRange);
                 *
                 * //előző bejegyzéshez vizsgálat+mergelés
                 * MergeInList(timeRange, prev);
                 *
                 * //következő bejegyzéshez vizsgálat+mergelés
                 * MergeInList(timeRange, next);*/


                //kitörlöm az összes intervallumot, amit teljesen befed a hozzáadandó intervallum.
                var toDelete = TimeRanges
                               .Where(x => x.DateTimeStart >= tcTimeRange.DateTimeStart && x.EndOfTimeRange(TimeUnit) <= tcTimeRange.EndOfTimeRange(TimeUnit))
                               .ToList();
                foreach (var tr in toDelete)
                {
                    RemoveTimeRangeFromList(tr);
                }

                //megnézem, van e olyan intervallum, amit a hozzáadandó időszak kezdetével összeér.
                var startIntersecting = TimeRanges
                                        .Where(x => x.DateTimeStart <= tcTimeRange.DateTimeStart && x.EndOfTimeRange(TimeUnit) >= tcTimeRange.DateTimeStart)
                                        .FirstOrDefault();
                //megnézem, van e olyan intervallum, amit a hozzáadandó időszak végével összeér.
                var endIntersecting = TimeRanges
                                      .Where(x => x.DateTimeStart <= tcTimeRange.EndOfTimeRange(TimeUnit) && x.EndOfTimeRange(TimeUnit) >= tcTimeRange.EndOfTimeRange(TimeUnit))
                                      .FirstOrDefault();

                var worktr = newTaskControl_TimeRange(tcTimeRange.DateTimeStart, tcTimeRange.DurationCount);
                // Hozzáadoma listához az új időintervallumot
                AddTimeRangeToList(worktr);

                //megnézem, van e olyan intervallum, amit a hozzáadandó időszak kezdetével összeér. Ha van ilyen, akkor összevonom a hozzáadandó időszakkal.
                var mergedtr = MergeInList(worktr, startIntersecting);

                //megnézem, van e olyan intervallum, amit a hozzáadandó időszak végével összeér. Ha van ilyen, akkor összevonom a hozzáadandó időszakkal.
                MergeInList(mergedtr, endIntersecting);
            }

            //Az új időintervallumot felveszem a listába
            SaveChanges();
        }
Esempio n. 3
0
        /// <summary>
        /// Az adott időintervallumot kiveszi a listából.
        /// </summary>
        public void RemoveTimeRange(TimeRange timeRange)
        {
            ReloadData();

            if (TimeUnit == TimeUnit.Infinity)
            {
                foreach (var tr in TimeRanges.ToList())
                {
                    RemoveTimeRangeFromList(tr);
                }
            }
            else
            {
                var tcTimeRange = newTaskControl_TimeRange(timeRange.DateTimeStart, timeRange.DurationCount);
                //1. megnézem, van e olyan intervallum, amit a törlendő időszak kezdetével összeér. Ha van ilyen, kettébontom 2 időszakra.

                var startIntersecting = TimeRanges
                                        .Where(x => x.DateTimeStart <= tcTimeRange.DateTimeStart && x.EndOfTimeRange(TimeUnit) >= tcTimeRange.DateTimeStart)
                                        .FirstOrDefault();
                SplitInList(startIntersecting, tcTimeRange.DateTimeStart);
                //2. megnézem, van e olyan intervallum, amit a törlendő időszak végével összeér. Ha van ilyen, kettébontom 2 időszakra.
                var entIntersecting = TimeRanges
                                      .Where(x => x.DateTimeStart <= tcTimeRange.EndOfTimeRange(TimeUnit) && x.EndOfTimeRange(TimeUnit) >= tcTimeRange.EndOfTimeRange(TimeUnit))
                                      .FirstOrDefault();
                SplitInList(entIntersecting, tcTimeRange.EndOfTimeRange(TimeUnit));

                //3. kitörlöm az összes intervallumot, amit teljesen befed a törlendő intervallum.
                var toDelete = TimeRanges
                               .Where(x => x.DateTimeStart >= tcTimeRange.DateTimeStart && x.EndOfTimeRange(TimeUnit) <= tcTimeRange.EndOfTimeRange(TimeUnit))
                               .ToList();
                foreach (var tr in toDelete)
                {
                    RemoveTimeRangeFromList(tr);
                }
            }
            //Az új időintervallumot felveszem a listába
            SaveChanges();
        }
Esempio n. 4
0
        /// <summary>
        /// Invertálja a Timeranges-t. Olyan időintervallumokat tartalmazó TimeControl -t ad vissza, ami a beadott dátumok közötti összes meg nem jelölt időszakot tartalmazza.
        /// </summary>
        public TaskControl GetInverseTimeControl(TimeRange timeRange)
        {
            var res = new TaskControl(TimeUnit);

            ReloadData();
            if (TimeUnit == TimeUnit.Infinity)
            {
                if (TimeRanges.Any())
                {
                    res.RemoveTimeRange(TimeRange.Infinity());
                }
                else
                {
                    res.AddTimeRange(TimeRange.Infinity());
                }
            }
            else
            {
                //Ez az az időpont, amelyik már éppen NINCS benne a vizsgált időszakban
                DateTime realStartTime = TimeFunctions.TruncDateTime(TimeUnit, timeRange.DateTimeStart);
                DateTime realEndTime   = timeRange.EndOfTimeRange(TimeUnit);


                /*if (TimeType == TimeType.Moment)//Ha időpontot vizsgálok, akkor a záró időpontot kiterjesztem a megadott időpontot tartalmazó időszak végéig.
                 *      realEndTime = AddDateTime(realEndTime, 1);
                 * else//Ha időszakot vizsgálok, akkor a kapott endtime paraméterben levő időpontot még intervallumon belülinek veszem, ezért a záró időpontot kiterjesztem 1 legkisebb időegységgel.
                 *      realEndTime = realEndTime/*.AddTicks(1)*/
                ;
                //realEndTime =

                var trInInterval = TimeRanges.Where(x => x.EndOfTimeRange(TimeUnit) > realStartTime && x.DateTimeStart < realEndTime).OrderBy(x => x.DateTimeStart);


                //első időszak előtti rész
                var first = trInInterval.FirstOrDefault();
                if (first != null && first.DateTimeStart > realStartTime)
                {
                    var tr = newTaskControl_TimeRange(realStartTime, TimeCountBetween(realStartTime, first.DateTimeStart));
                    res.TimeRanges.Add(tr);
                }


                TaskControl_TimeRange?prevTimeRange = null;

                //hozzáadom az egyes időintervallumok között kihagyott időszakokat
                foreach (var actTimeRange in trInInterval)
                {
                    if (prevTimeRange != null)
                    {
                        var starttime = prevTimeRange.EndOfTimeRange(TimeUnit);
                        var tr        = newTaskControl_TimeRange(starttime, TimeCountBetween(starttime, actTimeRange.DateTimeStart));

                        if (tr.DurationCount > 0)
                        {
                            res.TimeRanges.Add(tr);
                        }
                    }
                    prevTimeRange = actTimeRange;
                }

                //hozzáadom az utolsó utáni-t
                var last = trInInterval.LastOrDefault();
                if (last != null && AddDateTime(last.DateTimeStart, last.DurationCount) < realEndTime)
                {
                    var starttime = last.EndOfTimeRange(TimeUnit);
                    var tr        = newTaskControl_TimeRange(starttime, TimeCountBetween(starttime, realEndTime));
                    if (tr.DurationCount > 0)
                    {
                        res.TimeRanges.Add(tr);
                    }
                }

                if (!trInInterval.Any())
                {
                    var tr = newTaskControl_TimeRange(realStartTime, TimeCountBetween(realStartTime, realEndTime));
                    res.TimeRanges.Add(tr);
                }
            }
            return(res);
        }