private void DrawLine(VisualTextLine line) { if (line.Index < visuals.Count) { visuals.Insert(line.Index, line); visuals.RemoveAt(line.Index + 1); line.Draw(); } else { visuals.Add(line); line.Draw(); } }
private void RedrawCollapsedLine(VisualTextLine collapsedLine, int line) { if (line >= visuals.Count) { visuals.Add(null); } else { visuals[line] = null; } visuals[line] = collapsedLine; collapsedLine.Draw(); }
public IEnumerable<VisualTextLine> GetLinesToRedrawAfterCollapse(IReadOnlyList<VisualTextLine> visuals, VisualTextLine collapsedLine, TextRange range) { var linesToRedraw = new List<VisualTextLine>(); if (range.StartPosition.Line == range.EndPosition.Line) { return linesToRedraw; } var collapseEndLine = range.EndPosition.Line; for (int i = collapseEndLine + 1, newIndex = collapsedLine.Index + 1; i < visuals.Count; i++, newIndex++) { var line = visuals[i].CloneWithIndexChange(newIndex); linesToRedraw.Add(line); } return linesToRedraw; }
private VisualTextLine GetPartialLineBeforeCollapse(IEnumerable<CharInfo> charInfos, VisualTextLine line, int startIndex, int count) { var collapseInfo = charInfos.First(info => !info.IsCharacter); var contents = line.RenderedText; var textBeforeCollapse = string.Empty; if (collapseInfo.PrevCharPosition.Column >= startIndex) { textBeforeCollapse = contents.Substring(startIndex, collapseInfo.PrevCharPosition.Column); } else { textBeforeCollapse = contents.Substring(startIndex); } var diff = 0; if (startIndex + count >= collapseInfo.NextCharPosition.Column) { diff = (startIndex + count) - collapseInfo.NextCharPosition.Column; } var textAfterCollapse = string.Join("", contents.Skip(collapseInfo.NextCharPosition.Column).Take(diff)); return VisualTextLine.Create(textBeforeCollapse + textAfterCollapse, line.Index); }
private VisualTextLine GetPartialLineAfterCollapse(VisualTextLine line, int startIndex, int count) { var firstPart = line.RenderedText.Substring(startIndex, count); return VisualTextLine.Create(firstPart, line.Index); }
private VisualTextLine CutStandardLine(VisualTextLine line, int startIndex, int count) { var contents = line.GetStringContents()[0]; var newText = string.Empty; if (startIndex + count == line.Length) { newText = contents.Substring(startIndex); } else { newText = contents.Substring(startIndex, count - startIndex); } return VisualTextLine.Create(newText, line.Index); }
private VisualTextLine Cut(VisualTextLine line, int startIndex, int? count = null) { var substringLength = count == null ? line.Length - startIndex : count.Value; if (line is CollapsedVisualTextLine) { var charInfos = Enumerable.Range(startIndex, substringLength).Select(index => line.GetCharInfoAt(index)); if (charInfos.Any(info => !info.IsCharacter)) { return GetPartialLineBeforeCollapse(charInfos, line, startIndex, substringLength); } else { return GetPartialLineAfterCollapse(line, startIndex, substringLength); } } else { return CutStandardLine(line, startIndex, substringLength); } }
private int[] GetCollapseSelectionRange(TextPosition clickPosition, VisualTextLine activeLine, int lineLength) { var startColumn = clickPosition.Column; var endColumn = clickPosition.Column; if (endColumn + 1 <= lineLength) { endColumn += 1; } else { startColumn -= 1; } // move left from current position for (var i = clickPosition.Column; i >= 0; i--) { var charInfo = activeLine.GetCharInfoAt(i); if (!charInfo.IsCharacter && !char.IsLetterOrDigit(charInfo.Text[0])) { startColumn = i; } else { break; } } // move right from current position for (var i = clickPosition.Column; i < lineLength; i++) { var charInfo = activeLine.GetCharInfoAt(i); if (!charInfo.IsCharacter && !char.IsLetterOrDigit(charInfo.Text[0])) { endColumn = i + 1; } else { break; } } return new[] { startColumn, endColumn }; }