// This is actual implementation to make highlight change notification.
        // This is called when highlight needs to be changed without public TextSelection change event.
        internal void InternalOnSelectionChanged()
        {
            ITextPointer newStart;
            ITextPointer newEnd;
            ITextPointer invalidRangeLeftStart;
            ITextPointer invalidRangeLeftEnd;
            ITextPointer invalidRangeRightStart;
            ITextPointer invalidRangeRightEnd;
            TextSelectionHighlightChangedEventArgs args;

            // If the current seleciton is interim selection, we do not highlight it
            // and we make newStart == newEnd.
            if (!_selection.IsInterimSelection)
            {
                newStart = _selection.Start;
            }
            else
            {
                newStart = _selection.End;
            }

            newEnd = _selection.End;

            // We want to raise an event that tracks the change tightly --
            // only identifying content where the selection status actually changed.
            // This is important for render performance.
            //
            // Ex:
            // Old selection: 012<selection>345</selection>678
            // New selection: 0123<selection>456</selection>78
            //
            // Should raise (3-3), (6-6) as deltas, not (3-6).
            //

            // Get the left side invalid range.
            if (_oldStart.CompareTo(newStart) < 0)
            {
                invalidRangeLeftStart = _oldStart;
                invalidRangeLeftEnd = TextPointerBase.Min(newStart, _oldEnd);
            }
            else
            {
                invalidRangeLeftStart = newStart;
                invalidRangeLeftEnd = TextPointerBase.Min(newEnd, _oldStart);
            }

            // Get the right side invalid range.
            if (_oldEnd.CompareTo(newEnd) < 0)
            {
                invalidRangeRightStart = TextPointerBase.Max(newStart, _oldEnd);
                invalidRangeRightEnd = newEnd;
            }
            else
            {
                invalidRangeRightStart = TextPointerBase.Max(newEnd, _oldStart);
                invalidRangeRightEnd = _oldEnd;
            }

            _oldStart = newStart;
            _oldEnd = newEnd;

            if (this.Changed != null)
            {
                if (invalidRangeLeftStart.CompareTo(invalidRangeLeftEnd) != 0 || invalidRangeRightStart.CompareTo(invalidRangeRightEnd) != 0)
                {
                    args = new TextSelectionHighlightChangedEventArgs(invalidRangeLeftStart, invalidRangeLeftEnd, invalidRangeRightStart, invalidRangeRightEnd);

                    this.Changed(this, args);
                }
            }
        }
        // This is actual implementation to make highlight change notification.
        // This is called when highlight needs to be changed without public TextSelection change event.
        internal void InternalOnSelectionChanged()
        {
            ITextPointer newStart;
            ITextPointer newEnd;
            ITextPointer invalidRangeLeftStart;
            ITextPointer invalidRangeLeftEnd;
            ITextPointer invalidRangeRightStart;
            ITextPointer invalidRangeRightEnd;
            TextSelectionHighlightChangedEventArgs args;

            // If the current seleciton is interim selection, we do not highlight it
            // and we make newStart == newEnd.
            if (!_selection.IsInterimSelection)
            {
                newStart = _selection.Start;
            }
            else
            {
                newStart = _selection.End;
            }

            newEnd = _selection.End;

            // We want to raise an event that tracks the change tightly --
            // only identifying content where the selection status actually changed.
            // This is important for render performance.
            //
            // Ex:
            // Old selection: 012<selection>345</selection>678
            // New selection: 0123<selection>456</selection>78
            //
            // Should raise (3-3), (6-6) as deltas, not (3-6).
            //

            // Get the left side invalid range.
            if (_oldStart.CompareTo(newStart) < 0)
            {
                invalidRangeLeftStart = _oldStart;
                invalidRangeLeftEnd   = TextPointerBase.Min(newStart, _oldEnd);
            }
            else
            {
                invalidRangeLeftStart = newStart;
                invalidRangeLeftEnd   = TextPointerBase.Min(newEnd, _oldStart);
            }

            // Get the right side invalid range.
            if (_oldEnd.CompareTo(newEnd) < 0)
            {
                invalidRangeRightStart = TextPointerBase.Max(newStart, _oldEnd);
                invalidRangeRightEnd   = newEnd;
            }
            else
            {
                invalidRangeRightStart = TextPointerBase.Max(newEnd, _oldStart);
                invalidRangeRightEnd   = _oldEnd;
            }

            _oldStart = newStart;
            _oldEnd   = newEnd;

            if (this.Changed != null)
            {
                if (invalidRangeLeftStart.CompareTo(invalidRangeLeftEnd) != 0 || invalidRangeRightStart.CompareTo(invalidRangeRightEnd) != 0)
                {
                    args = new TextSelectionHighlightChangedEventArgs(invalidRangeLeftStart, invalidRangeLeftEnd, invalidRangeRightStart, invalidRangeRightEnd);

                    this.Changed(this, args);
                }
            }
        }