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);
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; } } }