From 8698272c4b1ffe58293223f21eabe46ebc9fe17b Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Thu, 1 May 2014 17:28:54 +0200 Subject: [PATCH] When replacing the whole document, ensure the deleted lines have IsDeleted set to true. --- .../Document/LineManagerTests.cs | 7 +++++++ .../ICSharpCode.AvalonEdit/Document/LineManager.cs | 8 +++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit.Tests/Document/LineManagerTests.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit.Tests/Document/LineManagerTests.cs index ae2bc2fbff..e209ffc58f 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit.Tests/Document/LineManagerTests.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit.Tests/Document/LineManagerTests.cs @@ -18,6 +18,7 @@ using System; using System.Collections.Generic; +using System.Linq; using NUnit.Framework; namespace ICSharpCode.AvalonEdit.Document @@ -46,10 +47,16 @@ namespace ICSharpCode.AvalonEdit.Document { document.Text = "Hello,\nWorld!"; Assert.AreEqual(2, document.LineCount); + var oldLines = document.Lines.ToArray(); document.Text = ""; Assert.AreEqual("", document.Text); Assert.AreEqual(0, document.TextLength); Assert.AreEqual(1, document.LineCount); + Assert.AreSame(oldLines[0], document.Lines.Single()); + Assert.IsFalse(oldLines[0].IsDeleted); + Assert.IsTrue(oldLines[1].IsDeleted); + Assert.IsNull(oldLines[0].NextLine); + Assert.IsNull(oldLines[1].PreviousLine); } [Test] diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Document/LineManager.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Document/LineManager.cs index a45ec4c5bb..fcc4cc3d06 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Document/LineManager.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Document/LineManager.cs @@ -105,6 +105,13 @@ namespace ICSharpCode.AvalonEdit.Document { // keep the first document line DocumentLine ls = documentLineTree.GetByNumber(1); + // but mark all other lines as deleted, and detach them from the other nodes + for (DocumentLine line = ls.NextLine; line != null; line = line.NextLine) { + line.isDeleted = true; + line.parent = line.left = line.right = null; + } + // Reset the first line to detach it from the deleted lines + ls.ResetLine(); SimpleSegment ds = NewLineFinder.NextNewLine(document, 0); List lines = new List(); int lastDelimiterEnd = 0; @@ -117,7 +124,6 @@ namespace ICSharpCode.AvalonEdit.Document ls = new DocumentLine(document); ds = NewLineFinder.NextNewLine(document, lastDelimiterEnd); } - ls.ResetLine(); ls.TotalLength = document.TextLength - lastDelimiterEnd; lines.Add(ls); documentLineTree.RebuildTree(lines);