internal void Add(int logicalLineNumber, DocumentLine line) { if (line == null) { return; } var newLine = new MdTextViewLine(this, textEditor, line, logicalLineNumber, textEditor.TextViewMargin.GetLayout(line)); for (int i = 0; i < Count; i++) { if (((MdTextViewLine)this [i]).LineNumber == logicalLineNumber) { this [i] = newLine; return; } } int index = 0; for (; index < Count; index++) { if (this [index].Start.Position > newLine.Start.Position) { break; } } Insert(index, newLine); }
internal void Add(int logicalLineNumber, DocumentLine line) { if (line == null) { return; } var newLine = new MdTextViewLine(this, textEditor, line, logicalLineNumber, textEditor.TextViewMargin.GetLayout(line)); for (int i = 0; i < Count; i++) { if (((MdTextViewLine)this [i]).LineNumber == logicalLineNumber) { this [i] = newLine; return; } } Add(newLine); }
internal ITextViewLine Add(int logicalLineNumber, DocumentLine line, TextViewMargin.LayoutWrapper layoutWrapper) { if (line == null) { return(null); } if (Count == 0) { this.textSnapshot = textEditor.TextSnapshot; } else { System.Diagnostics.Debug.Assert(this.textSnapshot == textEditor.TextSnapshot); } if (line.EndOffsetIncludingDelimiter > textSnapshot.Length) // prevent to create invalid text view lines. { return(null); } var newLine = new MdTextViewLine(this, textEditor, line, logicalLineNumber, layoutWrapper); for (int i = 0; i < Count; i++) { if (((MdTextViewLine)this [i]).LineNumber == logicalLineNumber) { this [i] = newLine; return(newLine); } } int index = 0; for (; index < Count; index++) { if (this [index].Start.Position > newLine.Start.Position) { break; } } Insert(index, newLine); return(newLine); }
internal ITextViewLine Add(int logicalLineNumber, DocumentLine line) { if (line == null) { return(null); } if (Count == 0) { this.textSnapshot = textEditor.TextSnapshot; } else { System.Diagnostics.Debug.Assert(this.textSnapshot == textEditor.TextSnapshot); } var newLine = new MdTextViewLine(this, textEditor, line, logicalLineNumber, textEditor.TextViewMargin.GetLayout(line)); for (int i = 0; i < Count; i++) { if (((MdTextViewLine)this [i]).LineNumber == logicalLineNumber) { this [i] = newLine; return(newLine); } } int index = 0; for (; index < Count; index++) { if (this [index].Start.Position > newLine.Start.Position) { break; } } Insert(index, newLine); return(newLine); }
internal void OnVisualBufferChanged(object sender, TextContentChangedEventArgs e) { if (textSnapshot != null) { foreach (ITextChange textChange in e.Changes) { Span textChangeCurrentSpan; if (e.Before == textSnapshot) { textChangeCurrentSpan = textChange.OldSpan; } else if (e.After == textSnapshot) { textChangeCurrentSpan = textChange.NewSpan; } else { ITrackingSpan textChangeOldSpan = e.Before.CreateTrackingSpan(textChange.OldSpan, SpanTrackingMode.EdgeInclusive); textChangeCurrentSpan = textChangeOldSpan.GetSpan(textSnapshot); } var startLine = textSnapshot.GetLineFromPosition(textChangeCurrentSpan.Start); var endLine = startLine; if (startLine.EndIncludingLineBreak.Position < textChangeCurrentSpan.End) { endLine = textSnapshot.GetLineFromPosition(textChangeCurrentSpan.End); } for (int i = startLine.LineNumber; i <= endLine.LineNumber; i++) { modifiedLinesCache.Add(i); } } } // Recreate MdTextViewLine for the current snapshot for all lines except those // modified as those will get recreated during render foreach (MdTextViewLine line in this) { int lineNumber = line.LineNumber; if (!modifiedLinesCache.Contains(lineNumber - 1)) { reusedLinesCache.Add(line); } } this.Clear(); var newSnapshot = e.After; foreach (MdTextViewLine line in reusedLinesCache) { var snapshotLine = textSnapshot.GetLineFromLineNumber(line.LineNumber - 1); var lineStart = textSnapshot.CreateTrackingPoint(snapshotLine.Start, PointTrackingMode.Negative); var newLineStart = lineStart.GetPosition(newSnapshot); var newSnapshotLine = newSnapshot.GetLineFromPosition(newLineStart); int lineNumber = newSnapshotLine.LineNumber + 1; var documentLine = textEditor.Document.GetLine(lineNumber); var newLine = new MdTextViewLine(this, textEditor, documentLine, lineNumber, textEditor.TextViewMargin.GetLayout(documentLine)); Add(newLine); } modifiedLinesCache.Clear(); reusedLinesCache.Clear(); textSnapshot = newSnapshot; // we need this to synchronize MultiSelectionBroker to the new snapshot this.textEditor.TextArea.RaiseLayoutChanged(); }