diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ChangeMarkerMargin.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ChangeMarkerMargin.cs index 55053aebd8..83626a33b3 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ChangeMarkerMargin.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ChangeMarkerMargin.cs @@ -54,11 +54,19 @@ namespace ICSharpCode.AvalonEdit.AddIn TextView textView = this.TextView; if (textView != null && textView.VisualLinesValid) { + var zeroLineInfo = changeWatcher.GetChange(0); + + Debug.Assert(zeroLineInfo.Change == ChangeType.None || zeroLineInfo.Change == ChangeType.Deleted); + foreach (VisualLine line in textView.VisualLines) { Rect rect = new Rect(0, line.VisualTop - textView.ScrollOffset.Y, 5, line.Height); LineChangeInfo info = changeWatcher.GetChange(line.FirstDocumentLine.LineNumber); + if (zeroLineInfo.Change == ChangeType.Deleted && line.FirstDocumentLine.LineNumber == 1 && info.Change != ChangeType.Unsaved) { + info.Change = ChangeType.Modified; + } + switch (info.Change) { case ChangeType.None: break; @@ -142,9 +150,31 @@ namespace ICSharpCode.AvalonEdit.AddIn TextEditor editor = this.TextView.Services.GetService(typeof(TextEditor)) as TextEditor; markerService = this.TextView.Services.GetService(typeof(ITextMarkerService)) as ITextMarkerService; + LineChangeInfo zeroLineInfo = changeWatcher.GetChange(0); + int offset, length; bool hasNewVersion = changeWatcher.GetNewVersionFromLine(line, out offset, out length); + if (line == 1 && zeroLineInfo.Change == ChangeType.Deleted) { + int zeroStartLine; bool zeroAdded; + startLine = 1; + string deletedText = changeWatcher.GetOldVersionFromLine(0, out zeroStartLine, out zeroAdded); + var docLine = editor.Document.GetLineByNumber(line); + string newLine = DocumentUtilitites.GetLineTerminator(changeWatcher.CurrentDocument, 1); + deletedText += newLine; + deletedText += editor.Document.GetText(docLine.Offset, docLine.Length); + if (oldText != null) + oldText = deletedText + newLine + oldText; + else + oldText = deletedText; + + if (!hasNewVersion) { + offset = 0; + length = docLine.Length; + hasNewVersion = true; + } + } + if (hasNewVersion) { if (marker != null) markerService.Remove(marker); @@ -158,14 +188,12 @@ namespace ICSharpCode.AvalonEdit.AddIn } if (oldText != null) { - // TODO : deletions on line 0 cannot be displayed. - LineChangeInfo currLineInfo = changeWatcher.GetChange(startLine); - if (currLineInfo.Change == ChangeType.Deleted) { + if (currLineInfo.Change == ChangeType.Deleted && !(line == 1 && zeroLineInfo.Change == ChangeType.Deleted)) { var docLine = editor.Document.GetLineByNumber(startLine); if (docLine.DelimiterLength == 0) - oldText = DocumentUtilitites.GetLineTerminator(changeWatcher.CurrentDocument, startLine); + oldText = DocumentUtilitites.GetLineTerminator(changeWatcher.CurrentDocument, startLine) + oldText; oldText = editor.Document.GetText(docLine.Offset, docLine.TotalLength) + oldText; } diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/DefaultChangeWatcher.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/DefaultChangeWatcher.cs index 1fcc51c072..34b258b58f 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/DefaultChangeWatcher.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/DefaultChangeWatcher.cs @@ -56,8 +56,7 @@ namespace ICSharpCode.AvalonEdit.AddIn } else { if (baseDocument == null) { // if the file is not under subversion, the document is the opened document - var doc = new TextDocument(textDocument.Text); - baseDocument = new AvalonEditDocumentAdapter(doc, null); + baseDocument = DocumentUtilitites.LoadReadOnlyDocumentFromBuffer(document.CreateSnapshot()); } } @@ -194,7 +193,7 @@ namespace ICSharpCode.AvalonEdit.AddIn var startDocumentLine = baseDocument.GetLine(info.OldStartLineNumber + 1); var endLine = baseDocument.GetLine(info.OldEndLineNumber); - return TextUtilities.NormalizeNewLines(baseDocument.GetText(startDocumentLine.Offset, endLine.EndOffset - startDocumentLine.Offset), DocumentUtilitites.GetLineTerminator(document, newStartLine)); + return TextUtilities.NormalizeNewLines(baseDocument.GetText(startDocumentLine.Offset, endLine.EndOffset - startDocumentLine.Offset), DocumentUtilitites.GetLineTerminator(document, newStartLine == 0 ? 1 : newStartLine)); } newStartLine = 0; diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/LineChangeInfo.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/LineChangeInfo.cs index 42e7d21ea0..ad8c7e7014 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/LineChangeInfo.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/LineChangeInfo.cs @@ -35,7 +35,7 @@ namespace ICSharpCode.AvalonEdit.AddIn public struct LineChangeInfo : IEquatable { - public static readonly LineChangeInfo EMPTY = new LineChangeInfo(ChangeType.None, -1, -1); + public static readonly LineChangeInfo EMPTY = new LineChangeInfo(ChangeType.None, 1, 1); ChangeType change;