Browse Source

implement display of deletions on line 0 in ChangeMarkerMargin

4.1
Siegfried Pammer 15 years ago
parent
commit
94dea92156
  1. 36
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ChangeMarkerMargin.cs
  2. 5
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/DefaultChangeWatcher.cs
  3. 2
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/LineChangeInfo.cs

36
src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ChangeMarkerMargin.cs

@ -54,11 +54,19 @@ namespace ICSharpCode.AvalonEdit.AddIn
TextView textView = this.TextView; TextView textView = this.TextView;
if (textView != null && textView.VisualLinesValid) { 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) { foreach (VisualLine line in textView.VisualLines) {
Rect rect = new Rect(0, line.VisualTop - textView.ScrollOffset.Y, 5, line.Height); Rect rect = new Rect(0, line.VisualTop - textView.ScrollOffset.Y, 5, line.Height);
LineChangeInfo info = changeWatcher.GetChange(line.FirstDocumentLine.LineNumber); 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) { switch (info.Change) {
case ChangeType.None: case ChangeType.None:
break; break;
@ -142,9 +150,31 @@ namespace ICSharpCode.AvalonEdit.AddIn
TextEditor editor = this.TextView.Services.GetService(typeof(TextEditor)) as TextEditor; TextEditor editor = this.TextView.Services.GetService(typeof(TextEditor)) as TextEditor;
markerService = this.TextView.Services.GetService(typeof(ITextMarkerService)) as ITextMarkerService; markerService = this.TextView.Services.GetService(typeof(ITextMarkerService)) as ITextMarkerService;
LineChangeInfo zeroLineInfo = changeWatcher.GetChange(0);
int offset, length; int offset, length;
bool hasNewVersion = changeWatcher.GetNewVersionFromLine(line, out offset, out 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 (hasNewVersion) {
if (marker != null) if (marker != null)
markerService.Remove(marker); markerService.Remove(marker);
@ -158,14 +188,12 @@ namespace ICSharpCode.AvalonEdit.AddIn
} }
if (oldText != null) { if (oldText != null) {
// TODO : deletions on line 0 cannot be displayed.
LineChangeInfo currLineInfo = changeWatcher.GetChange(startLine); 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); var docLine = editor.Document.GetLineByNumber(startLine);
if (docLine.DelimiterLength == 0) 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; oldText = editor.Document.GetText(docLine.Offset, docLine.TotalLength) + oldText;
} }

5
src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/DefaultChangeWatcher.cs

@ -56,8 +56,7 @@ namespace ICSharpCode.AvalonEdit.AddIn
} else { } else {
if (baseDocument == null) { if (baseDocument == null) {
// if the file is not under subversion, the document is the opened document // if the file is not under subversion, the document is the opened document
var doc = new TextDocument(textDocument.Text); baseDocument = DocumentUtilitites.LoadReadOnlyDocumentFromBuffer(document.CreateSnapshot());
baseDocument = new AvalonEditDocumentAdapter(doc, null);
} }
} }
@ -194,7 +193,7 @@ namespace ICSharpCode.AvalonEdit.AddIn
var startDocumentLine = baseDocument.GetLine(info.OldStartLineNumber + 1); var startDocumentLine = baseDocument.GetLine(info.OldStartLineNumber + 1);
var endLine = baseDocument.GetLine(info.OldEndLineNumber); 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; newStartLine = 0;

2
src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/LineChangeInfo.cs

@ -35,7 +35,7 @@ namespace ICSharpCode.AvalonEdit.AddIn
public struct LineChangeInfo : IEquatable<LineChangeInfo> public struct LineChangeInfo : IEquatable<LineChangeInfo>
{ {
public static readonly LineChangeInfo EMPTY = new LineChangeInfo(ChangeType.None, -1, -1); public static readonly LineChangeInfo EMPTY = new LineChangeInfo(ChangeType.None, 1, 1);
ChangeType change; ChangeType change;

Loading…
Cancel
Save