Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/monodevelop.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/main
diff options
context:
space:
mode:
Diffstat (limited to 'main')
-rw-r--r--main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.Views/EditorCompareWidgetBase.cs41
-rw-r--r--main/src/core/Mono.TextEditor.Shared/Mono.TextEditor.Utils/TextBreaker.cs9
2 files changed, 48 insertions, 2 deletions
diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.Views/EditorCompareWidgetBase.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.Views/EditorCompareWidgetBase.cs
index df71cb3487..1f10044251 100644
--- a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.Views/EditorCompareWidgetBase.cs
+++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.Views/EditorCompareWidgetBase.cs
@@ -40,6 +40,7 @@ using MonoDevelop.Projects.Text;
using MonoDevelop.Core.Text;
using MonoDevelop.Ide.Editor;
using Microsoft.VisualStudio.Text;
+using MonoDevelop.Ide.TextEditing;
namespace MonoDevelop.VersionControl.Views
{
@@ -68,6 +69,7 @@ namespace MonoDevelop.VersionControl.Views
set {
leftDiff = value;
OnDiffChanged (EventArgs.Empty);
+ SetDiffEditorVersions ();
}
}
@@ -77,9 +79,32 @@ namespace MonoDevelop.VersionControl.Views
set {
rightDiff = value;
OnDiffChanged (EventArgs.Empty);
+ SetDiffEditorVersions ();
}
}
-
+
+ ITextSourceVersion [] diffVersions;
+
+ void SetDiffEditorVersions ()
+ {
+ if (diffVersions == null) // editors.Length never changes
+ diffVersions = new ITextSourceVersion [editors.Length];
+ for (int i = 0; i < editors.Length; i++) {
+ diffVersions [i] = editors [i].Document.Version;
+ }
+ }
+
+ bool IsEditorDiffValid ()
+ {
+ if (diffVersions == null)
+ return false;
+ for (int i = 0; i < editors.Length; i++) {
+ if (diffVersions [i].CompareAge (editors [i].Document.Version) != 0)
+ return false;
+ }
+ return true;
+ }
+
internal abstract MonoTextEditor MainEditor {
get;
}
@@ -147,11 +172,15 @@ namespace MonoDevelop.VersionControl.Views
if (editors.Length == 2) {
editors[0].Painted += delegate (object sender, PaintEventArgs args) {
+ if (!IsEditorDiffValid ())
+ return;
var myEditor = (TextArea)sender;
PaintEditorOverlay (myEditor, args, LeftDiff, true);
};
editors[1].Painted += delegate (object sender, PaintEventArgs args) {
+ if (!IsEditorDiffValid ())
+ return;
var myEditor = (TextArea)sender;
PaintEditorOverlay (myEditor, args, LeftDiff, false);
};
@@ -160,15 +189,21 @@ namespace MonoDevelop.VersionControl.Views
Add (rightDiffScrollBar);
} else {
editors[0].Painted += delegate (object sender, PaintEventArgs args) {
+ if (!IsEditorDiffValid ())
+ return;
var myEditor = (TextArea)sender;
PaintEditorOverlay (myEditor, args, LeftDiff, true);
};
editors[1].Painted += delegate (object sender, PaintEventArgs args) {
+ if (!IsEditorDiffValid ())
+ return;
var myEditor = (TextArea)sender;
PaintEditorOverlay (myEditor, args, LeftDiff, false);
PaintEditorOverlay (myEditor, args, RightDiff, false);
};
editors[2].Painted += delegate (object sender, PaintEventArgs args) {
+ if (!IsEditorDiffValid ())
+ return;
var myEditor = (TextArea)sender;
PaintEditorOverlay (myEditor, args, RightDiff, true);
};
@@ -287,7 +322,9 @@ namespace MonoDevelop.VersionControl.Views
static List<ISegment> BreakTextInWords (MonoTextEditor editor, int start, int count)
{
- return TextBreaker.BreakLinesIntoWords(editor, start, count);
+ var s = Math.Min (start, editor.LineCount);
+ var c = Math.Min (count, editor.LineCount - (s - 1));
+ return TextBreaker.BreakLinesIntoWords(editor, s, c);
}
static List<Cairo.Rectangle> CalculateChunkPath (MonoTextEditor editor, List<Hunk> diff, List<ISegment> words, bool useRemove)
diff --git a/main/src/core/Mono.TextEditor.Shared/Mono.TextEditor.Utils/TextBreaker.cs b/main/src/core/Mono.TextEditor.Shared/Mono.TextEditor.Utils/TextBreaker.cs
index 5be96e1b53..a727db5439 100644
--- a/main/src/core/Mono.TextEditor.Shared/Mono.TextEditor.Utils/TextBreaker.cs
+++ b/main/src/core/Mono.TextEditor.Shared/Mono.TextEditor.Utils/TextBreaker.cs
@@ -25,6 +25,7 @@
// THE SOFTWARE.
using System;
using System.Collections.Generic;
+using MonoDevelop.Core;
using MonoDevelop.Core.Text;
namespace Mono.TextEditor.Utils
@@ -74,9 +75,17 @@ namespace Mono.TextEditor.Utils
/// </param>
public static List<ISegment> BreakLinesIntoWords (TextDocument document, int startLine, int lineCount, bool includeDelimiter = true)
{
+ if (document is null)
+ throw new ArgumentNullException (nameof (document));
+ if (startLine < 1)
+ throw new ArgumentOutOfRangeException (nameof (startLine), "startLine >= 1, was " + startLine);
+ if (startLine - 1 + lineCount > document.LineCount)
+ throw new ArgumentOutOfRangeException (nameof (startLine), "startLine + lineCount <= " + (document.LineCount + 1) + ", was " + startLine);
var result = new List<ISegment> ();
for (int line = startLine; line < startLine + lineCount; line++) {
var lineSegment = document.GetLine (line);
+ if (lineSegment == null)
+ continue;
int offset = lineSegment.Offset;
bool wasIdentifierPart = false;
int lastWordEnd = 0;