private static SnapshotSpan?MapUpToView(ITextView textView, SnapshotSpan span)
        {
            // Must be called from the UI thread.
            var start = textView.GetPositionInView(span.Start);
            var end   = textView.GetPositionInView(span.End);

            if (start == null || end == null || end < start)
            {
                return(null);
            }

            return(new SnapshotSpan(start.Value, end.Value));
        }
Ejemplo n.º 2
0
        public static bool TryMoveCaretToAndEnsureVisible(this ITextView textView, VirtualSnapshotPoint point, IOutliningManagerService outliningManagerService = null, EnsureSpanVisibleOptions ensureSpanVisibleOptions = EnsureSpanVisibleOptions.None)
        {
            if (textView.IsClosed)
            {
                return(false);
            }

            var pointInView = textView.GetPositionInView(point.Position);

            if (!pointInView.HasValue)
            {
                return(false);
            }

            // If we were given an outlining service, we need to expand any outlines first, or else
            // the Caret.MoveTo won't land in the correct location if our target is inside a
            // collapsed outline.
            var outliningManager = outliningManagerService?.GetOutliningManager(textView);

            outliningManager?.ExpandAll(new SnapshotSpan(pointInView.Value, length: 0), match: _ => true);

            var newPosition = textView.Caret.MoveTo(new VirtualSnapshotPoint(pointInView.Value, point.VirtualSpaces));

            // We use the caret's position in the view's current snapshot here in case something
            // changed text in response to a caret move (e.g. line commit)
            var spanInView = new SnapshotSpan(newPosition.BufferPosition, 0);

            textView.ViewScroller.EnsureSpanVisible(spanInView, ensureSpanVisibleOptions);

            return(true);
        }
        internal void Commit(ITextView textView, ITextBuffer subjectBuffer, ITextSnapshot snapshot, char? commitChar)
        {
            var replacementSpan = ComputeReplacementSpan(subjectBuffer, snapshot);

            var insertedText = InsertFirstHalf(textView, subjectBuffer, commitChar, replacementSpan);

            InsertSecondHalf(textView, subjectBuffer, insertedText, replacementSpan);

            var targetCaretPosition = textView.GetPositionInView(ComputeCaretPoint(subjectBuffer, replacementSpan, insertedText));
            textView.Caret.MoveTo(targetCaretPosition.Value);
        }
Ejemplo n.º 4
0
        internal void Commit(ITextView textView, ITextBuffer subjectBuffer, ITextSnapshot snapshot, char?commitChar)
        {
            var replacementSpan = ComputeReplacementSpan(subjectBuffer, snapshot);

            var insertedText = InsertFirstHalf(textView, subjectBuffer, commitChar, replacementSpan);

            InsertSecondHalf(textView, subjectBuffer, insertedText, replacementSpan);

            var targetCaretPosition = textView.GetPositionInView(ComputeCaretPoint(subjectBuffer, replacementSpan, insertedText));

            textView.Caret.MoveTo(targetCaretPosition.Value);
        }
        /// <summary>
        /// check whether we can smart indent ourselves. we only attempt to smart indent ourselves
        /// if the line in subject buffer we do smart indenting maps back to the view as it is and
        /// if it starts from the beginning of the line
        /// </summary>
        private bool CanHandleOurselves(ITextView view, ITextBuffer subjectBuffer)
        {
            var lineInSubjectBuffer = view.GetCaretPoint(subjectBuffer).Value.GetContainingLine();

            // first, make sure whole line is map back to the view
            if (view.GetSpanInView(lineInSubjectBuffer.ExtentIncludingLineBreak).Count != 1)
            {
                return(false);
            }

            // now check, start position of the line is start position in the view
            var caretPosition       = view.GetPositionInView(view.GetVirtualCaretPoint(subjectBuffer).Value.Position);
            var containingLineCaret = caretPosition.Value.GetContainingLine();

            var startPositionSubjectBuffer = view.GetPositionInView(lineInSubjectBuffer.Start);
            var startPositionCaret         = view.GetPositionInView(containingLineCaret.Start);

            if (!startPositionSubjectBuffer.HasValue ||
                !startPositionCaret.HasValue ||
                startPositionCaret.Value != startPositionSubjectBuffer.Value)
            {
                // if start position of subject buffer is not equal to start position of view line,
                // we can't use the indenter
                return(false);
            }

            // get containing line in view from start position of the caret in view
            var containingLineView = startPositionCaret.Value.GetContainingLine();

            // make sure line start at the beginning of the line
            if (containingLineView.Start != startPositionCaret.Value)
            {
                return(false);
            }

            return(true);
        }