Example #1
0
        public void MoveCaretToSpan(Span span, MoveCaretOptions options)
        {
            var snapshot = wpfTextViewHost.TextView.TextSnapshot;

            Debug.Assert(span.End <= snapshot.Length);
            if (span.End > snapshot.Length)
            {
                return;
            }
            MoveCaretToPosition(span.End, options);

            bool isReversed = false;
            // If there's another reference at the caret, move caret to Start instead of End
            var nextRef = GetReferenceInfo(span.End);

            if (nextRef != null && nextRef.Value.Span != span)
            {
                wpfTextViewHost.TextView.Caret.MoveTo(new SnapshotPoint(snapshot, span.Start));
                isReversed = true;
            }

            if ((options & MoveCaretOptions.Select) == 0)
            {
                wpfTextViewHost.TextView.Selection.Clear();
            }
            else
            {
                wpfTextViewHost.TextView.Selection.Mode = TextSelectionMode.Stream;
                wpfTextViewHost.TextView.Selection.Select(new SnapshotSpan(snapshot, span), isReversed);
            }
        }
        public bool GoToLocation(object reference, MoveCaretOptions options)
        {
            if (reference == null)
            {
                return(false);
            }

            if (reference is IMemberDef member)
            {
                var spanData = currentContent.Content.ReferenceCollection.FirstOrNull(a => a.Data.IsDefinition && a.Data.Reference == member);
                return(GoToTarget(spanData, false, false, options));
            }

            if (reference is ParamDef pd)
            {
                var spanData = currentContent.Content.ReferenceCollection.FirstOrNull(a => a.Data.IsDefinition && (a.Data.Reference as Parameter)?.ParamDef == pd);
                return(GoToTarget(spanData, false, false, options));
            }

            if (reference is TextReference textRef)
            {
                var spanData = currentContent.Content.ReferenceCollection.FirstOrNull(a => a.Data.IsLocal == textRef.IsLocal && a.Data.IsDefinition == textRef.IsDefinition && a.Data.Reference == textRef.Reference);
                return(GoToTarget(spanData, false, false, options));
            }

            Debug.Fail(string.Format("Unknown type: {0} = {1}", reference.GetType(), reference));
            return(false);
        }
Example #3
0
 public void MoveCaretToSpan(SpanData <ReferenceInfo> refInfo, MoveCaretOptions options)
 {
     if (isDisposed)
     {
         throw new ObjectDisposedException(nameof(IDocumentViewer));
     }
     documentViewerControl.MoveCaretToSpan(refInfo.Span, options);
 }
Example #4
0
 public void MoveCaretToSpan(Span span, MoveCaretOptions options)
 {
     if (isDisposed)
     {
         throw new ObjectDisposedException(nameof(IDocumentViewer));
     }
     documentViewerControl.MoveCaretToSpan(span, options);
 }
Example #5
0
 public void MoveCaretToSpan(int position, int length, MoveCaretOptions options)
 {
     if (isDisposed)
     {
         throw new ObjectDisposedException(nameof(IDocumentViewer));
     }
     documentViewerControl.MoveCaretToSpan(new Span(position, length), options);
 }
Example #6
0
 public void MoveCaretToReference(object @ref, MoveCaretOptions options)
 {
     if (isDisposed)
     {
         throw new ObjectDisposedException(nameof(IDocumentViewer));
     }
     documentViewerControl.GoToLocation(@ref, options);
 }
 public GoToHelper(DocumentViewerControl owner, SpanData <ReferenceInfo> spanData, bool newTab, bool followLocalRefs, bool canRecordHistory, bool canFollowReference, MoveCaretOptions options)
 {
     this.owner              = owner;
     this.spanData           = spanData;
     this.newTab             = newTab;
     this.followLocalRefs    = followLocalRefs;
     this.canRecordHistory   = canRecordHistory;
     this.canFollowReference = canFollowReference;
     this.options            = options;
     owner.TextView.ViewportHeightChanged += TextView_ViewportHeightChanged;
 }
        public void MoveCaretToPosition(int position, MoveCaretOptions options)
        {
            var snapshot = wpfTextViewHost.TextView.TextSnapshot;

            if ((uint)position < (uint)snapshot.Length)
            {
                wpfTextViewHost.TextView.Caret.MoveTo(new SnapshotPoint(snapshot, position));
                wpfTextViewHost.TextView.EnsureCaretVisible((options & MoveCaretOptions.Center) != 0);
            }
            wpfTextViewHost.TextView.Selection.Clear();
            if ((options & MoveCaretOptions.Focus) != 0)
            {
                textEditorHelper.SetFocus();
            }
        }
        internal bool GoTo(SpanData <ReferenceInfo>?spanData, bool newTab, bool followLocalRefs, bool canRecordHistory, bool canFollowReference, MoveCaretOptions options)
        {
            if (spanData == null)
            {
                return(false);
            }

            // When opening a new tab, the textview isn't visible and has a 0 height, so wait until it's visible
            // before moving the caret.
            if (wpfTextViewHost.TextView.ViewportHeight == 0 && !wpfTextViewHost.TextView.VisualElement.IsVisible)
            {
                new GoToHelper(this, spanData.Value, newTab, followLocalRefs, canRecordHistory, canFollowReference, options);
                return(true);
            }

            return(GoToCore(spanData.Value, newTab, followLocalRefs, canRecordHistory, canFollowReference, options));
        }
 bool GoToTarget(SpanData <ReferenceInfo>?spanData, bool canFollowReference, bool canRecordHistory, MoveCaretOptions options) =>
 GoTo(spanData, false, true, canRecordHistory, canFollowReference, options);
Example #11
0
		internal bool GoTo(SpanData<ReferenceInfo>? spanData, bool newTab, bool followLocalRefs, bool canRecordHistory, bool canFollowReference, MoveCaretOptions options) {
			if (isDisposed)
				throw new ObjectDisposedException(nameof(IDocumentViewer));
			return documentViewerControl.GoTo(spanData, newTab, followLocalRefs, canRecordHistory, canFollowReference, options);
		}
Example #12
0
		public void MoveCaretToSpan(SpanData<ReferenceInfo> refInfo, MoveCaretOptions options) {
			if (isDisposed)
				throw new ObjectDisposedException(nameof(IDocumentViewer));
			documentViewerControl.MoveCaretToSpan(refInfo.Span, options);
		}
Example #13
0
		public void MoveCaretToSpan(int position, int length, MoveCaretOptions options) {
			if (isDisposed)
				throw new ObjectDisposedException(nameof(IDocumentViewer));
			documentViewerControl.MoveCaretToSpan(new Span(position, length), options);
		}
Example #14
0
		public void MoveCaretToReference(object @ref, MoveCaretOptions options) {
			if (isDisposed)
				throw new ObjectDisposedException(nameof(IDocumentViewer));
			documentViewerControl.GoToLocation(@ref, options);
		}
Example #15
0
 internal bool GoTo(SpanData <ReferenceInfo>?spanData, bool newTab, bool followLocalRefs, bool canRecordHistory, bool canFollowReference, MoveCaretOptions options)
 {
     if (isDisposed)
     {
         throw new ObjectDisposedException(nameof(IDocumentViewer));
     }
     return(documentViewerControl.GoTo(spanData, newTab, followLocalRefs, canRecordHistory, canFollowReference, options));
 }
        bool GoToCore(SpanData <ReferenceInfo> spanData, bool newTab, bool followLocalRefs, bool canRecordHistory, bool canFollowReference, MoveCaretOptions options)
        {
            Debug.Assert(spanData.Span.End <= wpfTextViewHost.TextView.TextSnapshot.Length);
            if (spanData.Span.End > wpfTextViewHost.TextView.TextSnapshot.Length)
            {
                return(false);
            }

            if (newTab)
            {
                Debug.Assert(canFollowReference);
                if (!canFollowReference)
                {
                    return(false);
                }
                textEditorHelper.FollowReference(spanData.ToTextReference(), newTab);
                return(true);
            }

            if (followLocalRefs)
            {
                if (!IsOwnerOf(spanData))
                {
                    if (!canFollowReference)
                    {
                        return(false);
                    }
                    textEditorHelper.FollowReference(spanData.ToTextReference(), newTab);
                    return(true);
                }

                var localTarget = FindDefinition(spanData);
                if (localTarget != null)
                {
                    spanData = localTarget.Value;
                }

                if (spanData.Data.IsDefinition)
                {
                    if (canRecordHistory)
                    {
                        if (!canFollowReference)
                        {
                            return(false);
                        }
                        textEditorHelper.FollowReference(spanData.ToTextReference(), newTab);
                    }
                    else
                    {
                        MoveCaretToSpan(spanData.Span, options);
                    }
                    return(true);
                }

                if (spanData.Data.IsLocal)
                {
                    return(false);
                }
                if (!canFollowReference)
                {
                    return(false);
                }
                textEditorHelper.FollowReference(spanData.ToTextReference(), newTab);
                return(true);
            }
            else
            {
                var localTarget = FindDefinition(spanData);
                if (localTarget != null)
                {
                    spanData = localTarget.Value;
                }

                int pos = -1;
                if (!spanData.Data.IsLocal)
                {
                    if (spanData.Data.IsDefinition)
                    {
                        pos = spanData.Span.End;
                    }
                }
                if (pos >= 0)
                {
                    if (canRecordHistory)
                    {
                        if (!canFollowReference)
                        {
                            return(false);
                        }
                        textEditorHelper.FollowReference(spanData.ToTextReference(), newTab);
                    }
                    else
                    {
                        if ((options & MoveCaretOptions.Focus) != 0)
                        {
                            textEditorHelper.SetFocus();
                        }
                        wpfTextViewHost.TextView.Selection.Clear();
                        wpfTextViewHost.TextView.Caret.MoveTo(new SnapshotPoint(wpfTextViewHost.TextView.TextSnapshot, pos));
                        wpfTextViewHost.TextView.EnsureCaretVisible((options & MoveCaretOptions.Center) != 0);
                    }
                    return(true);
                }

                if (spanData.Data.IsLocal)
                {
                    return(false);                      // Allow another handler to set a new caret position
                }
                if ((options & MoveCaretOptions.Focus) != 0)
                {
                    textEditorHelper.SetFocus();
                }
                if (!canFollowReference)
                {
                    return(false);
                }
                textEditorHelper.FollowReference(spanData.ToTextReference(), newTab);
                return(true);
            }
        }
Example #17
0
		public void MoveCaretToSpan(Span span, MoveCaretOptions options) {
			if (isDisposed)
				throw new ObjectDisposedException(nameof(IDocumentViewer));
			documentViewerControl.MoveCaretToSpan(span, options);
		}
Example #18
0
        bool GoTo(IMethodDebugService methodDebugService, ReferencePosition referencePosition, MoveCaretOptions options)
        {
            if (referencePosition == null)
            {
                return(false);
            }

            if (referencePosition.MethodSourceStatement != null)
            {
                var methodSourceStatement = referencePosition.MethodSourceStatement.Value;
                var methodStatement       = methodDebugService.FindByCodeOffset(methodSourceStatement.Method, methodSourceStatement.Statement.BinSpan.Start);
                if (methodStatement != null)
                {
                    MoveCaretToPosition(methodStatement.Value.Statement.TextSpan.Start, options);
                    return(true);
                }
            }

            if (referencePosition.SpanData != null)
            {
                var spanData = FindReferenceInfo(referencePosition.SpanData.Value);
                if (spanData != null)
                {
                    return(GoToTarget(spanData, false, false, options));
                }
            }

            return(false);
        }