/// <summary>
        /// Moves all intervals that lie within the given interval.
        /// </summary>
        /// <param name = "interval">The interval which specifies which elements will be moved.</param>
        /// <param name = "offset">The offset where to move the values in the interval.</param>
        public void MoveInterval(IInterval <TMath> interval, TMath offset)
        {
            // Keep track of the intervals that need to be moved.
            var movedIntervals = new List <IntervalValues>();

            foreach (IntervalValues intersectingRange in FindIntersections(interval))
            {
                IInterval <TMath> intersection = intersectingRange.Interval.Intersection(interval);

                // Remove part of the interval which will be moved, static parts can stay.
                SplitRemoveIntersection(intersectingRange, intersection);

                // Add moved remainder to list to be added again.
                var movedInterval = new Interval <TMath>(
                    Operator <TMath> .Add(intersection.Start, offset),
                    intersection.IsStartIncluded,
                    Operator <TMath> .Add(intersection.End, offset),
                    intersection.IsEndIncluded);
                movedIntervals.Add(new IntervalValues(intersectingRange.Values, movedInterval));
            }

            // Add moved intervals again.
            foreach (IntervalValues newRange in movedIntervals)
            {
                Add(newRange.Interval, newRange.Values);
            }
        }
Exemple #2
0
        /// <summary>
        /// Определяет пересекаются ли два интервала
        /// </summary>
        /// <param name="zone"></param>
        /// <param name="interval1Param"></param>
        /// <param name="interval2Param"></param>
        /// <returns></returns>
        public static bool DoesIntervalsIntersect(this ISerialAccessZone zone, IInterval interval1Param, IInterval interval2Param)
        {
            // Принимаем интервалы;
            var interval1 = interval1Param;
            var interval2 = interval2Param;

            // Определяем какой из них левый, а какой правый:
            // Если начальный момент одного меньше начального момента другого => первый является левым
            IInterval leftInterval;
            IInterval rightInterval;

            if (interval1.StartMoment.Value < interval2.StartMoment.Value)
            {
                leftInterval  = interval1;
                rightInterval = interval2;
            }
            else
            {
                leftInterval  = interval2;
                rightInterval = interval1;
            }

            // Если начальный момент правого интервала меньше конечного момента левого интервала => пересечение;
            // Если нет => нет пересечения;
            return(rightInterval.StartMoment.Value < leftInterval.EndMoment.Value);
        }
Exemple #3
0
        public void Union_NullOther_ThrowsInvalidOperationException()
        {
            IInterval <int> a = Interval.Create(10, 20);
            IInterval <int> b = null;

            Assert.Throws <InvalidOperationException>(() => a.GetUnion(b));
        }
Exemple #4
0
        public void Union_NullInterval_ThrowsInvalidOperationException()
        {
            IInterval <int> a = null;
            IInterval <int> b = Interval.Create(15, 25);

            Assert.Throws <InvalidOperationException>(() => a.GetUnion(b));
        }
Exemple #5
0
 /// <summary>
 /// Determine whether this interval intersects another
 /// </summary>
 /// <remarks>Same as !Disjoint(...)</remarks>
 /// <param name="other">Other interval</param>
 /// <returns>Whether there is an intersection</returns>
 public bool IntersectsWith(IInterval <TPoint, TSpan, TEndpoint, T> other)
 {
     return
         ((this.PointIsWithin(other.Left) && ((this.RightEndpoint.Inclusive && other.LeftEndpoint.Inclusive) || this.Right.CompareTo(other.Left) != 0)) ||
          (this.PointIsWithin(other.Right) && ((this.LeftEndpoint.Inclusive && other.RightEndpoint.Inclusive) || this.Left.CompareTo(other.Right) != 0)) ||
          (other.PointIsWithin(this.Left) && other.PointIsWithin(this.Right)));
 }
Exemple #6
0
 public Poller(IInterval interval, Func <bool> work, int workers = 1)
 {
     _workers  = workers;
     _work     = work;
     _interval = interval;
     _cancellationTokenSources = new CancellationTokenSource[workers];
 }
Exemple #7
0
        public void Union_IntervalsThatDoNotOverlapNorAreAdjacent_ThrowsInvalidOperationException()
        {
            IInterval <int> a = Interval.Create(10, 20);
            IInterval <int> b = Interval.Create(25, 30);

            Assert.Throws <InvalidOperationException>(() => a.GetUnion(b));
        }
Exemple #8
0
 /// <summary>
 /// The get edges.
 /// </summary>
 /// <param name="interval">
 /// The interval.
 /// </param>
 /// <returns>
 /// The <see cref="IEnumerable{T}"/>.
 /// </returns>
 public static IEnumerable <IEndPoint <T> > GetEndPoints <T>(this IInterval <T> interval)
     where T : IComparable <T>
 {
     return(new List <IEndPoint <T> > {
         interval.Min, interval.Max
     });
 }
Exemple #9
0
        internal static Status DecideAnnotationStatus(IInterval variant, IInterval transcript, AnnotationBehavior behavior)
        {
            bool overlapsTranscript = variant.Overlaps(transcript);

            if (!behavior.ReducedTranscriptAnnotation)
            {
                // handle small variants
                if (overlapsTranscript)
                {
                    return(Status.FullAnnotation);
                }
                if (behavior.NeedFlankingTranscripts && variant.Overlaps(transcript, OverlapBehavior.FlankingLength))
                {
                    return(Status.FlankingAnnotation);
                }
            }
            else if (overlapsTranscript)
            {
                // handle large variants
                if (behavior.CanonicalTranscriptOnly)
                {
                    return(Status.RohAnnotation);
                }
                return(Status.ReducedAnnotation);
            }

            return(Status.NoAnnotation);
        }
Exemple #10
0
        public IInterval <T> Pop()
        {
            if (_Elements.Count == 0)
            {
                throw new InvalidOperationException("Cannot pop from the heap, it is currently empty");
            }

            IInterval <T> lastElement = _Elements[_Elements.Count - 1];

            assume(lastElement != null);

            _Elements.RemoveAt(_Elements.Count - 1);
            IInterval <T> returnItem;

            if (_Elements.Count > 0)
            {
                returnItem = _Elements[0];
                assume(returnItem != null);
                _Elements[0] = lastElement;
                SiftUp(0);
            }
            else
            {
                returnItem = lastElement;
            }

            return(returnItem);
        }
Exemple #11
0
        private void SiftUp(int pos)
        {
            int           endPos   = Count;
            int           startPos = pos;
            IInterval <T> newItem  = _Elements[pos];

            // Bubble up the smaller child until hitting a leaf.
            int childPos = 2 * pos + 1;

            while (childPos < endPos)
            {
                // Set childpos to index of smaller child.
                int rightPos = childPos + 1;

                if (rightPos < endPos)
                {
                    assume(_Elements[rightPos] != null && _Elements[childPos] != null);
                    if (_Elements[rightPos].End.CompareTo(_Elements[childPos].End) <= 0)
                    {
                        childPos = rightPos;
                    }
                }

                // Move the smaller child up.
                _Elements[pos] = _Elements[childPos];
                pos            = childPos;
                childPos       = 2 * pos + 1;
            }

            _Elements[pos] = newItem;
            SiftDown(startPos, pos);
        }
        /// <summary>
        /// Tests if interval would be valid if it shared a track with another interval</summary>
        /// <param name="interval">Interval that is being modified</param>
        /// <param name="start">Prospective interval start; may be modified to make start valid</param>
        /// <param name="length">Prospective interval length; may be modified to make length valid</param>
        /// <param name="other">Other interval</param>
        /// <returns>True iff interval would be valid if it shared a track with the other interval</returns>
        public override bool IsIntervalValid(IInterval interval, ref float start, ref float length, IInterval other)
        {
            // If there is no overlap or a simple trimming will fix any overlap, then
            //  we're done.
            if (ClipAgainst(interval, ref start, ref length, other))
                return true;

            // Otherwise, try to reposition to the right.
            // Note: it would be helpful if Intervals were sorted.
            start = other.Start + other.Length;
            if (interval.Track != null)
            {
                IList<IInterval> intervals = interval.Track.Intervals;
                for (int i = 0; i < intervals.Count; i++)
                {
                    other = intervals[i];
                    if (other == interval)
                        continue;

                    if (!ClipAgainst(interval, ref start, ref length, other))
                    {
                        // position to the right of 'other' and try again
                        start = other.Start + other.Length;
                        i = -1;
                    }
                }
            }
            return true;
        }
Exemple #13
0
        private static IInterval[] GetMicroRnas()
        {
            var introns = new IInterval[1];

            introns[0] = new Interval(100, 200);
            return(introns);
        }
Exemple #14
0
        public static bool IsMergedWith(this IInterval self, IInterval other)
        {
            var s = self.ToInterval();
            var o = other.ToInterval();

            return(s.Start == o.Start && o.End == s.End);
        }
Exemple #15
0
        void PerformStabbingQuery(IntervalNode node, IInterval <TPoint> interval, List <IntervalNode> result)
        {
            if (node == null)
            {
                return;
            }

            if (interval.Start.CompareTo(node.MaxEndPoint) > 0)
            {
                return;
            }

            if (node.Left != null)
            {
                PerformStabbingQuery(node.Left, interval, result);
            }

            if (DoIntervalsOverlap(node, interval))
            {
                result.Add(node);
            }

            if (interval.End.CompareTo(node.Start) < 0)
            {
                return;
            }

            if (node.Right != null)
            {
                PerformStabbingQuery(node.Right, interval, result);
            }
        }
        /// <summary>
        /// Метод, возвращающий задержки при добавлении нового судна в конец очереди
        /// </summary>
        /// <param name="aircraftInterval"></param>
        /// <param name="safeMergeValueParam"></param>
        /// <returns></returns>
        private Tuple <int, int> GetDelaysForNewLastAircraft(IInterval aircraftInterval, int safeMergeValueParam)
        {
            // Принимаем интервал обратившегося судна;
            var currentInterval = aircraftInterval;
            var safeMergeValue  = safeMergeValueParam;

            // Получаем начальный момент последнего записанного судна
            var lastWrittenStartMoment = OccupationIntervals.Keys.OrderBy(key => key).Last();
            // Получаем конечный момент последнего записанного судна
            var lastWrittenEndMoment = OccupationIntervals[lastWrittenStartMoment];

            // Сохраняем интервал ожидания обработки = момент покидания площадки последним записанным судном
            // минус момент прибытия (без задержки) обратившегося судна;
            var processingDelay = lastWrittenEndMoment.Value - currentInterval.StartMoment.Value;

            // Сдвигаем текущий интервал на полученную задержку
            var shiftedCurrentInterval = ShiftInterval(currentInterval, processingDelay);

            // Получаем задержку для соблюдения интервала безопасного слияния
            var safeMergeDelay = GetSafeMergeDelay(new Interval(lastWrittenStartMoment, lastWrittenEndMoment),
                                                   shiftedCurrentInterval, safeMergeValue);

            // 4) Возвращаем в кортеже задержку для ожидания обработки и задержку для безопасного слияния;
            return(Tuple.Create(processingDelay, safeMergeDelay));
        }
Exemple #17
0
        public static IInterval <T> TryGetOverlappingInterval <T>([CanBeNull] this IInterval <T> interval, [CanBeNull] IInterval <T> other)
            where T : struct, IComparable <T>
        {
            if (ReferenceEquals(interval, other))
            {
                return(interval);
            }
            if (interval == null || other == null)
            {
                return(null);
            }

            T start = interval.Start;

            if (other.Start.CompareTo(start) > 0)
            {
                start = other.Start;
            }

            T end = interval.End;

            if (other.End.CompareTo(end) < 0)
            {
                end = other.End;
            }

            if (start.CompareTo(end) >= 0)
            {
                return(null);
            }

            return(new Interval <T>(start, end));
        }
Exemple #18
0
 private GeneralBnd(IVcfVariant variant, IInterval <uint> interval, bool is3Prime, ISimpleBreakEnd mate)
 {
     _baseVariant = variant;
     _interval    = interval;
     Is3Prime     = is3Prime;
     Mate         = mate;
 }
        internal static Status DecideAnnotationStatus(IInterval variant, IInterval transcript,
                                                      AnnotationBehavior behavior, IInterval gene)
        {
            if (variant.Contains(gene) && behavior.ReducedTranscriptAnnotation)
            {
                return(Status.SvCompleteOverlapAnnotation);
            }
            if (variant.Contains(gene) && !behavior.ReducedTranscriptAnnotation)
            {
                return(Status.FullAnnotation);
            }
            if (!variant.Contains(gene) && variant.Overlaps(transcript) && behavior.ReducedTranscriptAnnotation)
            {
                return(Status.ReducedAnnotation);
            }
            if (!variant.Contains(gene) && variant.Overlaps(transcript) && !behavior.ReducedTranscriptAnnotation)
            {
                return(Status.FullAnnotation);
            }
            if (!variant.Overlaps(transcript) && variant.Overlaps(transcript, OverlapBehavior.FlankingLength) && behavior.NeedFlankingTranscript)
            {
                return(Status.FlankingAnnotation);
            }

            return(Status.NoAnnotation);
        }
Exemple #20
0
 /// <summary>
 /// Checks if an interval contains a value
 /// </summary>
 /// <typeparam name="T">Type of the interval values</typeparam>
 /// <param name="owningInterval">Owning interval</param>
 /// <param name="value">Value</param>
 /// <param name="captureEqual">True if equal values should be considered as containing, otherwise false</param>
 /// <returns>True if the interval contains the value, otherwise false</returns>
 /// <exception cref="ArgumentNullException">Throws if any provided value is null</exception>
 public static bool Contains <T>(this IInterval <T> owningInterval, T value, bool captureEqual = true)
     where T : IComparable <T>
 {
     if (owningInterval == null)
     {
         throw new ArgumentNullException(nameof(owningInterval), "Owning interval is null");
     }
     else if (owningInterval.Start == null)
     {
         throw new ArgumentNullException(nameof(owningInterval.Start), "Owning interval Start is null");
     }
     else if (owningInterval.Stop == null)
     {
         throw new ArgumentNullException(nameof(owningInterval.Stop), "Owning interval Stop is null");
     }
     else if (value == null)
     {
         throw new ArgumentNullException(nameof(value), "Value is null");
     }
     else
     {
         if (captureEqual)
         {
             return(owningInterval.Start.CompareTo(value) <= 0 && owningInterval.Stop.CompareTo(value) >= 0);
         }
         else
         {
             return(owningInterval.Start.CompareTo(value) < 0 && owningInterval.Stop.CompareTo(value) > 0);
         }
     }
 }
Exemple #21
0
 /// <summary>
 /// Gets the intersection between two intervals
 /// </summary>
 /// <typeparam name="T">Type of the intervals</typeparam>
 /// <param name="owningInterval">Owning interval</param>
 /// <param name="interval">Interval</param>
 /// <param name="captureEqual">True if equal values should be considered as intersecting, otherwise false</param>
 /// <returns>Intersection</returns>
 /// <exception cref="ArgumentNullException">Throws if any provided value is null</exception>
 /// <exception cref="ArgumentException">Throws if the provided values does not intersect</exception>
 public static IInterval <T> GetIntersection <T>(this IInterval <T> owningInterval, IInterval <T> interval, bool captureEqual = true)
     where T : IComparable <T>
 {
     if (interval == null)
     {
         throw new ArgumentNullException(nameof(interval), "Interval is null");
     }
     else
     {
         try
         {
             return(GetIntersection(owningInterval, interval.Start, interval.Stop, captureEqual));
         }
         catch (ArgumentNullException ex)
         {
             if (ex.ParamName == "firstValue")
             {
                 throw new ArgumentNullException(nameof(interval.Start), "Interval Start is null");
             }
             else if (ex.ParamName == "secondValue")
             {
                 throw new ArgumentNullException(nameof(interval.Stop), "Interval Stop is null");
             }
             else
             {
                 throw;
             }
         }
     }
 }
Exemple #22
0
 public virtual IInterval <T> Overlap(IInterval <T> other)
 {
     if (Intersects(other))
     {
         if (Start.CompareTo(other.Start) <= 0)
         {
             if (End.CompareTo(other.End) <= 0)
             {
                 return(Construct(other.Start, End));
             }
             else
             {
                 return(Construct(other.Start, other.End));
             }
         }
         else
         {
             if (End.CompareTo(other.End) <= 0)
             {
                 return(Construct(Start, End));
             }
             else
             {
                 return(Construct(Start, other.End));
             }
         }
     }
     else
     {
         return(null);
     }
 }
        public override void Add(TValue value)
        {
            // Get position for the new point.
            TMath position = default(TMath);

            if (_data.Count > 0)
            {
                // Add the new key point, with the accumulated distance since the last key point.
                KeyPoint last     = _data[_data.Count - 1];
                TMath    distance = DistanceBetween(last.Value, value);
                position = Operator <TMath> .Add(last.Position, distance);
            }

            // Create new key point.
            var newKeyPoint = new KeyPoint
            {
                Position = position,
                Value    = value
            };

            // Update data range.
            if (_dataRange == null)
            {
                // First object has zero distance.
                _dataRange = new Interval <TMath>(_zero, _zero);
            }
            else
            {
                _dataRange = _dataRange.ExpandTo(position);
            }

            _data.Add(newKeyPoint);
        }
Exemple #24
0
        /// <summary>
        /// Performans a range query.
        /// All items with overlapping ranges are returned.
        /// </summary>
        public IEnumerable <IInterval <T> > Query(IInterval <T> range)
        {
            // If the node has items, check their ranges.
            if (this._items != null)
            {
                var localSearch = this._items
                                  .TakeWhile(o => o.Min.Value.CompareTo(range.Max.Value) <= 0)
                                  .Where(o => o.Overlaps(range));

                foreach (var o in localSearch)
                {
                    yield return(o);
                }
            }

            // go to the left or go to the right of the tree, depending
            // where the query value lies compared to the center
            if (range.Min.Value.CompareTo(this._center) < 0 && this._leftNode != null)
            {
                foreach (var leftValue in this._leftNode.Query(range))
                {
                    yield return(leftValue);
                }
            }
            if (range.Max.Value.CompareTo(this._center) > 0 && this._rightNode != null)
            {
                foreach (var rightValue in this._rightNode.Query(range))
                {
                    yield return(rightValue);
                }
            }
        }
Exemple #25
0
        private void owner_MouseDownPicked(object sender, HitEventArgs e)
        {
            if (e.MouseEvent.Button != MouseButtons.Left)
            {
                return;
            }

            TimelinePath hitPath = e.HitRecord.HitPath;

            bool isResizing = false;

            switch (e.HitRecord.Type)
            {
            case HitType.IntervalResizeLeft:
                if (Owner.IsEditable(hitPath) && (
                        Owner.Selection.SelectionContains(hitPath) ||
                        Owner.Select <IEvent>(hitPath)))
                {
                    IInterval hitInterval = e.HitRecord.HitTimelineObject as IInterval;
                    m_resizer  = new Resizer(Side.Left, ScaleMode.InPlace, hitInterval.Start, Owner);
                    isResizing = true;
                }
                break;

            case HitType.IntervalResizeRight:
                if (Owner.IsEditable(hitPath) && (
                        Owner.Selection.SelectionContains(hitPath) ||
                        Owner.Select <IEvent>(hitPath)))
                {
                    IInterval hitInterval = e.HitRecord.HitTimelineObject as IInterval;
                    m_resizer  = new Resizer(Side.Right, ScaleMode.InPlace, hitInterval.Start + hitInterval.Length, Owner);
                    isResizing = true;
                }
                break;

            case HitType.Custom:
            {
                HitRecordObject hitManipulator = e.HitRecord.HitObject as HitRecordObject;
                if (hitManipulator != null)
                {
                    if (hitManipulator.Side == Side.Left)
                    {
                        m_resizer = new Resizer(Side.Left, ScaleMode.TimePeriod, m_worldMin, Owner);
                    }
                    else
                    {
                        m_resizer = new Resizer(Side.Right, ScaleMode.TimePeriod, m_worldMax, Owner);
                    }
                    isResizing = true;
                }
            }
            break;

            default:
                m_resizer = null;
                break;
            }

            Owner.IsResizingSelection = isResizing; //legacy. obsolete.
        }
 internal static WittyerVariantInternal Create([NotNull] IVcfVariant baseVariant,
                                               IInterval <uint> baseInterval,
                                               WittyerVariantType svType,
                                               IContigAndInterval startInterval, Winner win,
                                               List <OverlapAnnotation> overlapInfo, IWittyerSample sample, IContigAndInterval endInterval)
 => new WittyerVariantInternal(baseVariant, baseInterval, svType, startInterval, win,
                               overlapInfo, sample, endInterval);
Exemple #27
0
        public static bool Finishes(this IInterval self, IInterval other)
        {
            var s = self.ToInterval();
            var o = other.ToInterval();

            return(s.Start > o.Start && s.End == o.End);
        }
Exemple #28
0
        // Gets the track and group that contains 'target'. Also handles if 'target' is a track or group.
        private static void GetTrackAndGroup(ITimelineObject target, out ITrack targetTrack, out IGroup targetGroup)
        {
            IInterval interval = target as IInterval;

            if (interval != null)
            {
                targetTrack = interval.Track;
            }
            else
            {
                IKey key = target as IKey;
                if (key != null)
                {
                    targetTrack = key.Track;
                }
                else
                {
                    targetTrack = target as ITrack;
                }
            }

            if (targetTrack != null)
            {
                targetGroup = targetTrack.Group;
            }
            else
            {
                targetGroup = target as IGroup;
            }
        }
Exemple #29
0
        List <IntervalNode> PerformStabbingQuery(IntervalNode node, IInterval <TPoint> interval)
        {
            var result = new List <IntervalNode>();

            PerformStabbingQuery(node, interval, result);
            return(result);
        }
Exemple #30
0
        public void DetermineExonicEffect(ITranscript transcript, IInterval variant, IMappedPosition position,
                                          int coveredCdnaStart, int coveredCdnaEnd, int coveredCdsStart, int coveredCdsEnd, string altAllele,
                                          bool startCodonInsertionWithNoImpact)
        {
            HasExonOverlap = position.ExonStart != -1 || position.ExonEnd != -1;

            if (transcript.Translation != null)
            {
                var codingRegion = transcript.Translation.CodingRegion;
                AfterCoding  = IsAfterCoding(variant.Start, variant.End, transcript.End, codingRegion.End);
                BeforeCoding = IsBeforeCoding(variant.Start, variant.End, transcript.Start, codingRegion.Start);
                WithinCds    = IsWithinCds(coveredCdsStart, coveredCdsEnd, codingRegion, variant);
                IsCoding     = !startCodonInsertionWithNoImpact && (position.CdsStart != -1 || position.CdsEnd != -1);
            }

            WithinCdna = IsWithinCdna(coveredCdnaStart, coveredCdnaEnd, transcript.TotalExonLength);

            if (coveredCdsStart != -1 && coveredCdsEnd != -1)
            {
                var varLen    = coveredCdsEnd - coveredCdsStart + 1;
                var alleleLen = altAllele?.Length ?? 0;
                HasFrameShift = position.CdsStart != -1 && position.CdsEnd != -1 && !Codons.IsTriplet(alleleLen - varLen);
            }

            OverlapWithMicroRna = IsMatureMirnaVariant(position.CdnaStart, position.CdnaEnd, transcript.MicroRnas,
                                                       transcript.BioType == BioType.miRNA);
        }
Exemple #31
0
        public static bool Meets(this IInterval self, IInterval other)
        {
            var s = self.ToInterval();
            var o = other.ToInterval();

            return(s.End == o.Start);
        }
 /// <summary>
 /// Tests if length would be valid for the given interval</summary>
 /// <param name="interval">Interval</param>
 /// <param name="length">Prospective length; may be modified to make length valid</param>
 /// <returns>True iff length value would be valid for the given interval</returns>
 public override bool IsLengthValid(IInterval interval, ref float length)
 {
     // 0 length intervals will crash DefaultTimelineRenderer
     if (length > 0)
         return true;
     length = 1;
     return false;
 }
Exemple #33
0
        /// <summary>
        /// If you want to use it as a pulser.
        /// Use this constructor to raise events
        /// </summary>
        /// <param name="interval"></param>
        /// <param name="work"></param>
        public AsyncPoller(IInterval interval, Func<CancellationToken, Task<IEnumerable<Event>>> work)
        {

            _work = async (token) =>
            {
                var events = await work(token);
                var any = events.Any();
                PulseGenerated(this, events);
                return false;
            };
            _interval = interval;
        }
 public override RefResult NotifyRefChanged(IInterval changeInt, IReferenceTarget hTarget, ref UIntPtr partID, RefMessage message)
 {
     if (hTarget.Handle != target._Target.Handle)
         return RefResult.Dontcare;
     if (message == this.message)
         action();
     if (message == RefMessage.RefDeleted)
     {
         Kernel.listeners.Remove(this);
         Dispose();
     }
     return RefResult.Succeed;
 }
        private bool ClipAgainst(IInterval interval, ref float start, ref float length, IInterval other)
        {
            // trim interval to avoid overlaps; interval is invalid only if that forces its
            //  length to be 0 or less
            float end = start + length;
            float otherStart = other.Start;
            float otherEnd = otherStart + other.Length;

            // if disjoint, return true
            if (start >= otherEnd || end <= otherStart)
                return true;

            // if interval encloses and is larger than the other, cut as little as possible
            if (start <= otherStart && end >= otherEnd && length > other.Length)
            {
                if ((end - otherEnd) < (otherStart - start))
                    length = otherStart - start;
                else
                {
                    start = otherEnd;
                    length = end - start;
                }
                return true;
            }

            // if interval contains other's start, try to trim its length
            if (start < otherStart)
            {
                length = otherStart - start;
                return true;
            }

            // if interval contains other's end, try to move its start
            if (start < otherEnd && end > otherEnd)
            {
                length = end - otherEnd;
                start = otherEnd;
                return true;
            }

            // interval is the same as other or is inside other
            return false;
        }
Exemple #36
0
 /// <summary>
 /// Gets the bounding rectangle for an interval, in timeline coordinates</summary>
 /// <param name="interval">Interval</param>
 /// <param name="trackTop">Top of track holding interval, in timeline coordinates</param>
 /// <param name="transform">Transform, taking timeline coordinates to display</param>
 /// <param name="clientRectangle">Bounds of displayed area of timeline, in screen space</param>
 /// <returns>Bounding rectangle for the interval, in timeline coordinates</returns>
 public RectangleF GetBounds(IInterval interval, float trackTop, Matrix transform,
     RectangleF clientRectangle)
 {
     var c = new Context(this, transform, clientRectangle, m_graphics);
     return GetBounds(interval, trackTop, c);
 }
Exemple #37
0
 /// <summary>
 /// Gets the bounding rectangle for an interval, in timeline coordinates</summary>
 /// <param name="interval">Interval</param>
 /// <param name="trackTop">Top of track holding interval, in timeline coordinates</param>
 /// <param name="c">Drawing context</param>
 /// <returns>Bounding rectangle for the interval, in timeline coordinates</returns>
 protected abstract RectangleF GetBounds(IInterval interval, float trackTop, Context c);
Exemple #38
0
        /// <summary>
        /// Finds hits on an interval, given a picking rectangle</summary>
        /// <param name="interval">Interval</param>
        /// <param name="bounds">Bounding rectangle, computed during layout phase</param>
        /// <param name="pickRect">Picking rectangle</param>
        /// <param name="c">Drawing context</param>
        /// <returns>Type of hit</returns>
        protected virtual HitType Pick(IInterval interval, RectangleF bounds, RectangleF pickRect, Context c)
        {
            if (!bounds.IntersectsWith(pickRect))
                return HitType.None;

            if (pickRect.Left <= bounds.Left && pickRect.Right >= bounds.Left)
                return HitType.IntervalResizeLeft;

            if (pickRect.Left <= bounds.Right && pickRect.Right >= bounds.Right)
                return HitType.IntervalResizeRight;

            return HitType.Interval;
        }
Exemple #39
0
 /// <summary>
 /// Draws an interval</summary>
 /// <param name="interval">Interval</param>
 /// <param name="bounds">Bounding rectangle, in screen space</param>
 /// <param name="drawMode">Drawing mode</param>
 /// <param name="c">Drawing context</param>
 protected abstract void Draw(IInterval interval, RectangleF bounds, DrawMode drawMode, Context c);
        /// <summary>
        /// Draws an interval</summary>
        /// <param name="interval">Interval</param>
        /// <param name="bounds">Bounding rectangle, in screen space</param>
        /// <param name="drawMode">Drawing mode</param>
        /// <param name="c">Drawing context</param>
        protected override void Draw(IInterval interval, RectangleF bounds, DrawMode drawMode, Context c)
        {
            Color color = interval.Color;
            switch (drawMode & DrawMode.States)
            {
                case DrawMode.Normal:
                    RectangleF realPart = new RectangleF(
                        bounds.X,
                        bounds.Y,
                        GdiUtil.TransformVector(c.Transform, interval.Length),
                        bounds.Height);
                    bool hasTail = realPart.Width < MinimumDrawnIntervalLength;

                    float h = color.GetHue();
                    float s = color.GetSaturation();
                    float b = color.GetBrightness();
                    Color endColor = ColorUtil.FromAhsb(color.A, h, s * 0.3f, b);
                    c.Graphics.FillRectangle(
                        realPart,
                        new PointF(0, realPart.Top),new PointF(0, realPart.Bottom),
                        color, endColor);

                    if (hasTail)
                    {
                        endColor = ColorUtil.FromAhsb(64, h, s * 0.3f, b);
                        RectangleF tailPart = new RectangleF(
                            realPart.Right,
                            bounds.Y,
                            bounds.Width - realPart.Width,
                            bounds.Height);
                        c.Graphics.FillRectangle(tailPart, endColor);
                    }

                    if (color.R + color.G + color.B < 3 * 160)
                        TextBrush.Color = SystemColors.HighlightText;
                    else
                        TextBrush.Color = SystemColors.WindowText;

                    c.Graphics.DrawText(interval.Name, c.TextFormat, bounds.Location, TextBrush);

                    if ((drawMode & DrawMode.Selected) != 0)
                    {
                        c.Graphics.DrawRectangle(
                            new RectangleF(bounds.X + 1, bounds.Y + 1, bounds.Width - 2, bounds.Height - 2),
                            SelectedBrush, 3.0f);
                    }
                    break;
                case DrawMode.Collapsed:
                    c.Graphics.FillRectangle(bounds, CollapsedBrush);
                    break;
                case DrawMode.Ghost:
                    c.Graphics.FillRectangle(bounds, Color.FromArgb(128, color));
                    bool showRight = (drawMode & DrawMode.ResizeRight) != 0;
                    float x = showRight ? bounds.Right : bounds.Left;
                    c.Graphics.DrawText(
                        GetXPositionString(x, c),
                        c.TextFormat,
                        new PointF(x, bounds.Bottom - c.FontHeight),
                        TextBrush);
                    break;
                case DrawMode.Invalid:
                    c.Graphics.FillRectangle(bounds, InvalidBrush);
                    break;
            }
        }
Exemple #41
0
 public Interval(IInterval i) { this.start = i.Start; this.end = i.End; }
 public void Given()
 {
     _interval = new Interval(null);
     _policy = _interval as Rainbow.ObjectFlow.Policies.Policy;
     Assert.IsNotNull(_policy);
 }
        /// <summary>
        /// Draws an interval</summary>
        /// <param name="interval">Interval</param>
        /// <param name="bounds">Bounding rectangle, in screen space</param>
        /// <param name="drawMode">Drawing mode</param>
        /// <param name="c">Drawing context</param>
        protected override void Draw(IInterval interval, RectangleF bounds, DrawMode drawMode, Context c)
        {
            Color color = interval.Color;
            switch (drawMode & DrawMode.States)
            {
                case DrawMode.Normal:
                    RectangleF realPart = new RectangleF(
                        bounds.X,
                        bounds.Y,
                        GdiUtil.TransformVector(c.Transform, interval.Length),
                        bounds.Height);
                    bool hasTail = realPart.Width < MinimumDrawnIntervalLength;
                    
                    float h = color.GetHue();
                    float s = color.GetSaturation();
                    float b = color.GetBrightness();
                    Color endColor = ColorUtil.FromAhsb(color.A, h, s * 0.3f, b);

                    using (LinearGradientBrush intervalBrush =
                        new LinearGradientBrush(realPart, color, endColor, LinearGradientMode.Vertical))
                    {
                        c.Graphics.FillRectangle(intervalBrush, realPart);
                        if (hasTail)
                        {
                            Color[] colors = intervalBrush.LinearColors;
                            colors[0] = Color.FromArgb(64, colors[0]);
                            colors[1] = Color.FromArgb(64, colors[1]);
                            intervalBrush.LinearColors = colors;
                            RectangleF tailPart = new RectangleF(
                                realPart.Right,
                                bounds.Y,
                                bounds.Width - realPart.Width,
                                bounds.Height);
                            c.Graphics.FillRectangle(intervalBrush, tailPart);
                        }
                    }

                    Brush textBrush = SystemBrushes.WindowText;
                    if ((int)color.R + (int)color.G + (int)color.B < 3 * 160)
                        textBrush = SystemBrushes.HighlightText;
                    c.Graphics.DrawString(interval.Name, c.Font, textBrush, bounds.Location);

                    if ((drawMode & DrawMode.Selected) != 0)
                    {
                        c.Graphics.DrawRectangle(m_selectedPen, bounds.X + 1, bounds.Y + 1, bounds.Width - 2, bounds.Height - 2);
                    }
                    break;
                case DrawMode.Collapsed:
                    c.Graphics.FillRectangle(m_collapsedBrush, bounds);
                    break;
                case DrawMode.Ghost:
                    using (Brush brush = new SolidBrush(Color.FromArgb(128, color)))
                    {
                        c.Graphics.FillRectangle(brush, bounds);
                        bool showRight = (drawMode & DrawMode.ResizeRight) != 0;
                        float x = showRight ? bounds.Right : bounds.Left;
                        c.Graphics.DrawString(GetXPositionString(x, c), c.Font, SystemBrushes.WindowText, x, bounds.Bottom - c.FontHeight);
                    }
                    break;
                case DrawMode.Invalid:
                    c.Graphics.FillRectangle(m_invalidBrush, bounds);
                    break;
            }
        }
Exemple #44
0
 public PollingWorker(IInterval interval, Func<bool> work)
 {
     _work = work;
     _interval = interval;
 }
 /// <summary>
 /// Tests if the interval would be valid if it shared a track with another interval.
 /// Any modification to 'start' and 'length' should not invalidate a previous test
 /// against a different interval, during a paste operation, for example.</summary>
 /// <param name="interval">Interval that is being modified</param>
 /// <param name="start">Prospective interval start; may be modified to make start valid</param>
 /// <param name="length">Prospective interval length; may be modified to make length valid</param>
 /// <param name="other">Other interval</param>
 /// <returns>True iff interval would be valid if it shared a track with the other interval</returns>
 public abstract bool IsIntervalValid(IInterval interval, ref float start, ref float length, IInterval other);
 private void SplitUnselectedInterval(IInterval interval, float fraction)
 {
     m_owner.TransactionContext.DoTransaction(delegate
         {
             DoSplit(interval, fraction);
         },
         "Split Interval");
 }
Exemple #47
0
 public AsyncPoller(IInterval interval, Func<CancellationToken, Task<bool>> work)
 {
     _work = work;
     _interval = interval;
 }
        /// <summary>
        /// Gets the bounding rectangle for an interval, in timeline coordinates</summary>
        /// <param name="interval">Interval</param>
        /// <param name="trackTop">Top of track holding interval</param>
        /// <param name="c">Drawing context</param>
        /// <returns>Bounding rectangle for the interval, in timeline coordinates</returns>
        protected override RectangleF GetBounds(IInterval interval, float trackTop, Context c)
        {
            // Calculate the width, in timeline coordinates. If the group is expanded, then
            //  make sure that interval meets the minimum visible width requirement.
            float visibleWidth = interval.Length;
            if (interval.Track != null &&
                interval.Track.Group != null &&
                interval.Track.Group.Expanded)
            {
                float minimumTimelineUnits = c.PixelSize.Width * MinimumDrawnIntervalLength;
                visibleWidth = Math.Max(visibleWidth, minimumTimelineUnits);
            }

            return new RectangleF(
                interval.Start,
                trackTop,
                visibleWidth,
                TrackHeight);
        }
 /// <summary>
 /// Tests if length would be valid for the given interval</summary>
 /// <param name="interval">Interval</param>
 /// <param name="length">Prospective length; may be modified to make length valid</param>
 /// <returns>True iff length value would be valid for the given interval</returns>
 public abstract bool IsLengthValid(IInterval interval, ref float length);
        private IInterval DoSplit(IInterval interval, float fraction)
        {
            IInterval rightSide = null;
            float originalStart = interval.Start;
            float originalLength = interval.Length;
            float worldX = originalStart + originalLength * fraction;

            worldX = m_owner.ConstrainFrameOffset(worldX);
            
            if (worldX > originalStart &&
                worldX < originalStart + originalLength)
            {
                // 'interval' becomes the left side and we create a new interval for the right side.
                rightSide = m_owner.Create(interval);
                rightSide.Start = worldX;
                rightSide.Length = originalLength - (worldX - originalStart);
                interval.Length = worldX - originalStart;
                interval.Track.Intervals.Add(rightSide);
            }
            return rightSide;
        }