Intersect() public method

Finds out of range intersects another range
public Intersect ( ITextRange range ) : bool
range ITextRange
return bool
Example #1
0
        /// <summary>
        /// Finds out items that overlap a text range
        /// </summary>
        /// <param name="range">Text range</param>
        /// <returns>List of items that overlap the range</returns>
        public virtual IReadOnlyList <T> ItemsInRange(ITextRange range)
        {
            List <T> list = null;

            int first = GetItemContaining(range.Start);

            if (first < 0)
            {
                first = GetFirstItemAfterPosition(range.Start);
            }

            if (first >= 0)
            {
                for (int i = first; i < Count; i++)
                {
                    if (_items[i].Start >= range.End)
                    {
                        break;
                    }

                    if (TextRange.Intersect(_items[i], range))
                    {
                        if (list == null)
                        {
                            list = new List <T>();
                        }

                        list.Add(_items[i]);
                    }
                }
            }

            return(list == null ? _emptyReadOnlyList : list);
        }
Example #2
0
 /// <summary>
 /// Finds out of range intersects another range
 /// </summary>
 /// <param name="start">Text range</param>
 /// <returns>True if ranges intersect</returns>
 public virtual bool Intersect(ITextRange range)
 {
     return(TextRange.Intersect(this, range.Start, range.Length));
 }
Example #3
0
 /// <summary>
 /// Finds out of range intersects another range
 /// </summary>
 /// <param name="start">Start of another range</param>
 /// <param name="length">Length of another range</param>
 /// <returns>True if ranges intersect</returns>
 public virtual bool Intersect(int start, int length)
 {
     return(TextRange.Intersect(this, start, length));
 }
Example #4
0
        protected virtual bool IsDestructiveChangeForSeparator(
            ISensitiveFragmentSeparatorsInfo separatorInfo,
            IReadOnlyList <T> itemsInRange,
            int start, int oldLength, int newLength,
            ITextProvider oldText, ITextProvider newText)
        {
            if (separatorInfo == null)
            {
                return(false);
            }

            if (separatorInfo.LeftSeparator.Length == 0 && separatorInfo.RightSeparator.Length == 0)
            {
                return(false);
            }

            // Find out if one of the existing fragments contains position
            // and if change damages fragment start or end separators
            var leftSeparator  = separatorInfo.LeftSeparator;
            var rightSeparator = separatorInfo.RightSeparator;

            // If no items are affected, change is unsafe only if new region contains separators.
            if (itemsInRange.Count == 0)
            {
                // Simple optimization for whitespace insertion
                if (oldLength == 0 && string.IsNullOrWhiteSpace(newText.GetText(new TextRange(start, newLength))))
                {
                    return(false);
                }

                // Take into account that user could have deleted space between existing
                // <! and -- or added - to the existing <!- so extend search range accordingly.
                var fragmentStart = Math.Max(0, start - leftSeparator.Length + 1);
                var fragmentEnd   = Math.Min(newText.Length, start + newLength + leftSeparator.Length - 1);

                var fragmentStartPosition = newText.IndexOf(leftSeparator, TextRange.FromBounds(fragmentStart, fragmentEnd), true);
                if (fragmentStartPosition >= 0)
                {
                    return(true);
                }

                fragmentStart = Math.Max(0, start - rightSeparator.Length + 1);
                fragmentEnd   = Math.Min(newText.Length, start + newLength + rightSeparator.Length - 1);

                fragmentStartPosition = newText.IndexOf(rightSeparator, TextRange.FromBounds(fragmentStart, fragmentEnd), true);
                if (fragmentStartPosition >= 0)
                {
                    return(true);
                }
                return(false);
            }

            // Is change completely inside an existing item?
            if (itemsInRange.Count == 1 && (itemsInRange[0].Contains(start) && itemsInRange[0].Contains(start + oldLength)))
            {
                // Check that change does not affect item left separator
                if (TextRange.Contains(itemsInRange[0].Start, leftSeparator.Length, start))
                {
                    return(true);
                }

                // Check that change does not affect item right separator. Note that we should not be using
                // TextRange.Intersect since in case oldLength is zero (like when user is typing right before %> or ?>)
                // TextRange.Intersect will determine that zero-length range intersects with the right separator
                // which is incorrect. Typing at position 10 does not change separator at position 10. Similarly,
                // deleting text right before %> or ?> does not make change destructive.
                var rightSeparatorStart = itemsInRange[0].End - rightSeparator.Length;
                if (start + oldLength > rightSeparatorStart)
                {
                    if (TextRange.Intersect(rightSeparatorStart, rightSeparator.Length, start, oldLength))
                    {
                        return(true);
                    }
                }

                // Touching left separator is destructive too, like when changing <% to <%@
                // Check that change does not affect item left separator (whitespace is fine)
                if (itemsInRange[0].Start + leftSeparator.Length == start)
                {
                    if (oldLength == 0)
                    {
                        var text = newText.GetText(new TextRange(start, newLength));
                        if (string.IsNullOrWhiteSpace(text))
                        {
                            return(false);
                        }
                    }
                    return(true);
                }

                var fragmentStart = itemsInRange[0].Start + separatorInfo.LeftSeparator.Length;
                fragmentStart = Math.Max(fragmentStart, start - separatorInfo.RightSeparator.Length + 1);
                var changeLength = newLength - oldLength;
                var fragmentEnd  = itemsInRange[0].End + changeLength;
                fragmentEnd = Math.Min(fragmentEnd, start + newLength + separatorInfo.RightSeparator.Length - 1);

                if (newText.IndexOf(separatorInfo.RightSeparator, TextRange.FromBounds(fragmentStart, fragmentEnd), true) >= 0)
                {
                    return(true);
                }

                return(false);
            }

            return(true);
        }
Example #5
0
 /// <summary>
 /// Finds out of range intersects another range
 /// </summary>
 /// <param name="range">Text range</param>
 /// <returns>True if ranges intersect</returns>
 public virtual bool Intersect(ITextRange range) => TextRange.Intersect(this, range.Start, range.Length);
Example #6
0
 /// <summary>
 /// Finds out of range intersects another range
 /// </summary>
 /// <param name="start">Start of another range</param>
 /// <param name="length">Length of another range</param>
 /// <returns>True if ranges intersect</returns>
 public virtual bool Intersect(int start, int length) => TextRange.Intersect(this, start, length);