示例#1
0
        LineElementDrawData CreateLineElementDrawData(StructureVisualizerData data)
        {
            var pen = GetPen(data.BlockKind);

            Debug.Assert(pen != null);
            double x = GetLineXPosition(data);

            return(new LineElementDrawData(pen, x));
        }
 LineElement FindLineElement(StructureVisualizerData info)
 {
     foreach (var lineElement in lineElements)
     {
         if (StructureVisualizerDataComparer.Instance.Equals(lineElement.StructureVisualizerData, info))
         {
             return(lineElement);
         }
     }
     return(null);
 }
            public double GetXPosition(StructureVisualizerData data)
            {
                TryUpdateState();
                var    topPoint = data.Top.Start.TranslateTo(toXPosDictSnapshot, PointTrackingMode.Negative);
                double x;

                if (toXPosDict.TryGetValue(topPoint.Position, out x))
                {
                    return(x);
                }

                var point  = GetBlockStartPoint(topPoint, data.Bottom.Start.TranslateTo(toXPosDictSnapshot, PointTrackingMode.Negative));
                var line   = wpfTextView.GetTextViewLineContainingBufferPosition(point);
                var bounds = line.GetExtendedCharacterBounds(point);

                x = Math.Round(bounds.Left + bounds.Width / 2 - PEN_THICKNESS / 2) + 0.5;
                toXPosDict[topPoint.Position] = x;
                return(x);
            }
 public LineElement(StructureVisualizerData info)
 {
     StructureVisualizerData = info;
 }
 double GetLineXPosition(StructureVisualizerData data) => xPosCache.GetXPosition(data);
示例#6
0
        IEnumerable <LineElementData> GetLineElementData(NormalizedSnapshotSpanCollection spans)
        {
            if (spans.Count == 0)
            {
                yield break;
            }
            var snapshot = spans[0].Snapshot;
            ITextSnapshotLine snapshotLine = null;
            SnapshotSpan      lineExtent;
            var prevLineExtent = default(SnapshotSpan);
            var list           = new List <StructureVisualizerData>();

            StructureVisualizerData[] listArray = null;
            List <ITextViewLine>      linesList = null;

            foreach (var span in spans)
            {
                var lines = GetTextViewLinesIntersectingSpan(span, ref linesList);
                foreach (var line in lines)
                {
                    if (snapshotLine != null)
                    {
                        if (line.Start >= snapshotLine.Start && line.EndIncludingLineBreak <= snapshotLine.EndIncludingLineBreak)
                        {
                            // Nothing
                        }
                        else if (line.Start == snapshotLine.EndIncludingLineBreak)
                        {
                            snapshotLine = snapshotLine.Snapshot.GetLineFromLineNumber(snapshotLine.LineNumber + 1);
                        }
                        else
                        {
                            snapshotLine = line.Start.GetContainingLine();
                        }
                        lineExtent = snapshotLine.Extent;
                    }
                    else if (line.IsFirstTextViewLineForSnapshotLine && line.IsLastTextViewLineForSnapshotLine)
                    {
                        lineExtent = line.Extent;
                    }
                    else
                    {
                        snapshotLine = line.Start.GetContainingLine();
                        lineExtent   = snapshotLine.Extent;
                    }

                    if (prevLineExtent != lineExtent)
                    {
                        list.Clear();
                        structureVisualizerServiceDataProvider.GetData(lineExtent, list);
                        listArray = list.Count == 0 ? Array.Empty <StructureVisualizerData>() : list.ToArray();
                    }

                    if (listArray.Length != 0)
                    {
                        var last = listArray[listArray.Length - 1];
                        // Don't add a vertical line to the line containing the start block
                        if (!(last.Top.Start >= lineExtent.Start && last.Top.End <= lineExtent.End))
                        {
                            var ary = listArray;
                            if (last.Bottom.Start >= lineExtent.Start && last.Bottom.End <= lineExtent.End)
                            {
                                ary = new StructureVisualizerData[listArray.Length - 1];
                                for (int i = 0; i < ary.Length; i++)
                                {
                                    ary[i] = listArray[i];
                                }
                            }
                            yield return(new LineElementData(line, ary));
                        }
                    }

                    prevLineExtent = lineExtent;
                }
            }
        }