private TaskControl_TimeRange Merge(TaskControl_TimeRange timeRange1, TaskControl_TimeRange timeRange2) { //ha frodított a sorrend, akkor megfordítva hívom meg if (timeRange2.DateTimeStart < timeRange1.DateTimeStart) { return(Merge(timeRange2, timeRange1)); } var timeRange1End = timeRange1.EndOfTimeRange(TimeUnit); var timeRange2End = timeRange2.EndOfTimeRange(TimeUnit); //timeRange1 teljesen befedi timeRange2-t, akkor timeRange1-et adom vissza if (timeRange1End >= timeRange2End) { return(timeRange1); } if (timeRange1End < timeRange2.DateTimeStart) { //Ha nem érnek össze az időszakok, akkor nem lehet mergelni throw new Exception($"Merge Error."); } else { //ha egymásra lógnak, vagy összeérnek az időszakok var res = newTaskControl_TimeRange(timeRange1.DateTimeStart, TimeCountBetween(timeRange1.DateTimeStart, timeRange2End)); return(res); } }
protected override void RemoveTimeRangeFromList(TaskControl_TimeRange timeRangeToMerge) { base.RemoveTimeRangeFromList(timeRangeToMerge); if (TaskControl_Item != null) { TaskControl_Item.TimeRanges.Remove(timeRangeToMerge); } }
/// <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(); }
private bool Mergeble(TaskControl_TimeRange timeRange1, TaskControl_TimeRange timeRange2) { //ha frodított a sorrend, akkor megfordítva hívom meg if (timeRange2.DateTimeStart < timeRange1.DateTimeStart) { return(Mergeble(timeRange2, timeRange1)); } return(timeRange1.EndOfTimeRange(TimeUnit) >= timeRange2.DateTimeStart); }
private Tuple <TaskControl_TimeRange, TaskControl_TimeRange?> Split(TaskControl_TimeRange timeRange, DateTime splittime) { if (!Splitable(timeRange, splittime)) { throw new Exception("Cannot split"); } TaskControl_TimeRange timeRange1 = newTaskControl_TimeRange(timeRange.DateTimeStart, TimeCountBetween(timeRange.DateTimeStart, splittime)); TaskControl_TimeRange timeRange2 = newTaskControl_TimeRange(splittime, TimeCountBetween(splittime, timeRange.EndOfTimeRange(TimeUnit))); return(new Tuple <TaskControl_TimeRange, TaskControl_TimeRange?>(timeRange1, timeRange2)); }
private void SplitInList(TaskControl_TimeRange timeRange, DateTime splittime) { if (timeRange == null) { return; } //ha az időintervallumok összeérnek if (Splitable(timeRange, splittime)) { //kiszedem a listából RemoveTimeRangeFromList(timeRange); //szétbontom var splittedTimeRanges = Split(timeRange, splittime); //felveszem listába AddTimeRangeToList(splittedTimeRanges.Item1); AddTimeRangeToList(splittedTimeRanges.Item2); } }
private bool Splitable(TaskControl_TimeRange timeRange, DateTime splittime) { return(splittime > timeRange.DateTimeStart && splittime < timeRange.EndOfTimeRange(TimeUnit)); }
//private void AddTimeRangeToList(TimeRange timeRange) => AddTimeRangeToList(new TaskControl_TimeRange(timeRange.DateTimeStart, timeRange.DurationCount)); protected virtual void RemoveTimeRangeFromList(TaskControl_TimeRange timeRangeToMerge) { TimeRanges.Remove(timeRangeToMerge); }