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);
        }
示例#3
0
        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();
        }