private IEnumerable <Line> GetUpdatedIndentGuides(IEnumerable <IBlock> blocks, double horizontalOffset, double spaceWidth) { ThreadHelper.ThrowIfNotOnUIThread(); foreach (var block in blocks) { var pointStart = new SnapshotPoint(_textView.TextSnapshot, block.Area.Start); var pointEnd = new SnapshotPoint(_textView.TextSnapshot, block.Area.End); var viewLineStart = _textView.GetTextViewLineContainingBufferPosition(pointStart); var viewLineEnd = _textView.GetTextViewLineContainingBufferPosition(pointEnd); if (viewLineStart.Equals(viewLineEnd)) { continue; } var lineStart = pointStart.GetContainingLine(); var spaceText = new SnapshotSpan(lineStart.Start, pointStart).GetText(); var tabs = spaceText.Count(ch => ch == '\t'); var indentStart = (spaceText.Length - tabs) + tabs * _tabSize; var leftOffset = indentStart * spaceWidth + horizontalOffset + _offsetX; yield return(new Line() { Stroke = Brushes.DarkGray, StrokeThickness = _thickness, StrokeDashArray = new DoubleCollection() { _dashSize, _spaceSize }, X1 = leftOffset, X2 = leftOffset, Y1 = (viewLineStart.Top != 0) ? viewLineStart.Bottom + _offsetY : _textView.ViewportTop, Y2 = (viewLineEnd.Top != 0) ? viewLineEnd.Top - _offsetY : _textView.ViewportBottom, }); } }
private int GetCaretCellPosition(ITextSnapshotLine line, SnapshotPoint caretBufferPosition) { var linePrefixText = new SnapshotSpan(line.Start, caretBufferPosition).GetText(); return(linePrefixText.Count(c => c == '|')); }