Beispiel #1
0
        private void HandleTreeViewSelectedItemChangedV3(object sender, RoutedPropertyChangedEventArgs <object> e)
        {
            try
            {
                if (Tagger == null)
                {
                    return;
                }

                if (Tokens4 != null || e.NewValue is Antlr4.Runtime.Tree.IParseTree)
                {
                    return;
                }

                using (Tagger.Update())
                {
                    Tagger.RemoveTagSpans(tagSpan => true);

                    if (Snapshot == null)
                    {
                        return;
                    }

                    CommonTree selected = e.NewValue as CommonTree;

                    IList <IToken> tokens = Tokens3;
                    if (tokens != null && selected != null)
                    {
                        if (selected.TokenStartIndex >= 0 && selected.TokenStopIndex >= 0)
                        {
                            IToken startToken = tokens[selected.TokenStartIndex];
                            IToken stopToken  = tokens[selected.TokenStopIndex];
                            Span   span       = new Span(startToken.StartIndex, stopToken.StopIndex - startToken.StartIndex + 1);
                            Span   sourceSpan = new Span(0, Snapshot.Length);
                            if (sourceSpan.Contains(span))
                            {
                                ITrackingSpan trackingSpan = Snapshot.CreateTrackingSpan(span, SpanTrackingMode.EdgeExclusive);
                                Tagger.CreateTagSpan(trackingSpan, PredefinedTextMarkerTags.Vivid);
                                var activeView = ActiveViewTrackerService.ActiveView;
                                if (activeView != null && activeView.TextBuffer == Snapshot.TextBuffer)
                                {
                                    activeView.ViewScroller.EnsureSpanVisible(new SnapshotSpan(Snapshot, span), EnsureSpanVisibleOptions.ShowStart);
                                }
                            }
                        }
                    }
                    else if (selected != null && selected.Token != null)
                    {
                        if (selected.Token.StartIndex >= 0 && selected.Token.StopIndex >= 0)
                        {
                            IToken token      = selected.Token;
                            Span   span       = new Span(token.StartIndex, token.StopIndex - token.StartIndex + 1);
                            Span   sourceSpan = new Span(0, Snapshot.Length);
                            if (sourceSpan.Contains(span))
                            {
                                ITrackingSpan trackingSpan = Snapshot.CreateTrackingSpan(span, SpanTrackingMode.EdgeExclusive);
                                Tagger.CreateTagSpan(trackingSpan, PredefinedTextMarkerTags.Vivid);
                                var activeView = ActiveViewTrackerService.ActiveView;
                                if (activeView != null && activeView.TextBuffer == Snapshot.TextBuffer)
                                {
                                    activeView.ViewScroller.EnsureSpanVisible(new SnapshotSpan(Snapshot, span), EnsureSpanVisibleOptions.ShowStart);
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception ex) when(!ErrorHandler.IsCriticalException(ex))
            {
            }
        }
        private void HandleTreeViewSelectedItemChangedV4(object sender, RoutedPropertyChangedEventArgs <object> e)
        {
            try
            {
                if (Tagger == null)
                {
                    return;
                }

                if (Tokens3 != null || e.NewValue is Antlr.Runtime.Tree.ITree)
                {
                    return;
                }

                using (Tagger.Update())
                {
                    Tagger.RemoveTagSpans(tagSpan => true);

                    if (Snapshot == null)
                    {
                        return;
                    }

                    IParseTree selected = e.NewValue as IParseTree;

                    IList <IToken> tokens = Tokens4;
                    if (tokens != null && selected != null)
                    {
                        if (selected.SourceInterval.a >= 0 && selected.SourceInterval.b >= 0)
                        {
                            IToken startToken = tokens[selected.SourceInterval.a];
                            IToken stopToken  = tokens[selected.SourceInterval.b];
                            Span   span       = new Span(startToken.StartIndex, stopToken.StopIndex - startToken.StartIndex + 1);
                            Span   sourceSpan = new Span(0, Snapshot.Length);
                            if (sourceSpan.Contains(span))
                            {
                                ITrackingSpan trackingSpan = Snapshot.CreateTrackingSpan(span, SpanTrackingMode.EdgeExclusive);
                                Tagger.CreateTagSpan(trackingSpan, PredefinedTextMarkerTags.Vivid);
                                var activeView = ActiveViewTrackerService.ActiveView;
                                if (activeView != null && activeView.TextBuffer == Snapshot.TextBuffer)
                                {
                                    activeView.ViewScroller.EnsureSpanVisible(new SnapshotSpan(Snapshot, span), EnsureSpanVisibleOptions.ShowStart);
                                }
                            }
                        }
                    }
                    else if (selected is ITerminalNode)
                    {
                        IToken token = ((ITerminalNode)selected).Symbol;
                        if (token.StartIndex >= 0 && token.StopIndex >= 0)
                        {
                            Span span       = new Span(token.StartIndex, token.StopIndex - token.StartIndex + 1);
                            Span sourceSpan = new Span(0, Snapshot.Length);
                            if (sourceSpan.Contains(span))
                            {
                                ITrackingSpan trackingSpan = Snapshot.CreateTrackingSpan(span, SpanTrackingMode.EdgeExclusive);
                                Tagger.CreateTagSpan(trackingSpan, PredefinedTextMarkerTags.Vivid);
                                var activeView = ActiveViewTrackerService.ActiveView;
                                if (activeView != null && activeView.TextBuffer == Snapshot.TextBuffer)
                                {
                                    activeView.ViewScroller.EnsureSpanVisible(new SnapshotSpan(Snapshot, span), EnsureSpanVisibleOptions.ShowStart);
                                }
                            }
                        }
                    }
                    else if (selected is IRuleNode)
                    {
                        //if (selected.Token.StartIndex >= 0 && selected.Token.StopIndex >= 0)
                        //{
                        //    IToken token = selected.Token;
                        //    Span span = new Span(token.StartIndex, token.StopIndex - token.StartIndex + 1);
                        //    Span sourceSpan = new Span(0, Snapshot.Length);
                        //    if (sourceSpan.Contains(span))
                        //    {
                        //        ITrackingSpan trackingSpan = Snapshot.CreateTrackingSpan(span, SpanTrackingMode.EdgeExclusive);
                        //        Tagger.CreateTagSpan(trackingSpan, PredefinedTextMarkerTags.Vivid);
                        //        var activeView = ActiveViewTrackerService.ActiveView;
                        //        if (activeView != null && activeView.TextBuffer == Snapshot.TextBuffer)
                        //            activeView.ViewScroller.EnsureSpanVisible(new SnapshotSpan(Snapshot, span), EnsureSpanVisibleOptions.ShowStart);
                        //    }
                        //}
                    }
                }
            }
            catch (Exception ex)
            {
                if (ErrorHandler.IsCriticalException(ex))
                {
                    throw;
                }
            }
        }