From 5fbc6ceef117403a1b5587db4d61a12e4bdf44ce Mon Sep 17 00:00:00 2001 From: Eusebiu Marcu Date: Wed, 5 Jan 2011 22:30:34 +0200 Subject: [PATCH] Added tooltip for ChangeMarkerMargin --- .../Src/ChangeMarkerMargin.cs | 63 ++++++++++++++++++- .../Src/DefaultChangeWatcher.cs | 26 ++++++-- .../AvalonEdit.AddIn/Src/LineChangeInfo.cs | 2 + 3 files changed, 85 insertions(+), 6 deletions(-) diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ChangeMarkerMargin.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ChangeMarkerMargin.cs index 03401ab0a0..66b05874f0 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ChangeMarkerMargin.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ChangeMarkerMargin.cs @@ -4,11 +4,12 @@ using System; using System.Collections.Generic; using System.Windows; +using System.Windows.Controls; +using System.Windows.Input; using System.Windows.Media; + using ICSharpCode.AvalonEdit.Editing; using ICSharpCode.AvalonEdit.Rendering; -using ICSharpCode.SharpDevelop; -using ICSharpCode.SharpDevelop.Editor; namespace ICSharpCode.AvalonEdit.AddIn { @@ -130,5 +131,63 @@ namespace ICSharpCode.AvalonEdit.AddIn { return new Size(5, 0); } + + #region Diffs tooltip + + ToolTip tooltip = new ToolTip(); + + protected override void OnMouseEnter(MouseEventArgs e) + { + var diffs = changeWatcher.GetDiffsByLine(GetLineFromMousePosition(e)); + + if (diffs != null && diffs.Count > 0) { + StackPanel stack = new StackPanel() { + Background = Brushes.White + }; + TextBlock oldTb = new TextBlock() { + FontFamily = new FontFamily("Courier New"), + Foreground = Brushes.Black, + Background = Brushes.White, + TextDecorations = TextDecorations.Strikethrough, + }; + + if (diffs[0] != null) + oldTb.Text = diffs[0].Text; + + TextBlock newTb = new TextBlock() { + FontFamily = new FontFamily("Courier New"), + Foreground = Brushes.Black, + Background = Brushes.White, + Text = diffs[1].Text + }; + + stack.Children.Add(oldTb); + stack.Children.Add(newTb); + tooltip.Content = stack; + tooltip.Background = Brushes.White; + tooltip.IsOpen = true; + } + + base.OnMouseEnter(e); + } + + protected override void OnMouseLeave(MouseEventArgs e) + { + tooltip.IsOpen = false; + base.OnMouseLeave(e); + } + + int GetLineFromMousePosition(MouseEventArgs e) + { + TextView textView = this.TextView; + if (textView == null) + return 0; + VisualLine vl = textView.GetVisualLineFromVisualTop(e.GetPosition(textView).Y + textView.ScrollOffset.Y); + if (vl == null) + return 0; + return vl.FirstDocumentLine.LineNumber; + } + + #endregion } } \ No newline at end of file diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/DefaultChangeWatcher.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/DefaultChangeWatcher.cs index 31bb0361aa..4a616e3ad5 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/DefaultChangeWatcher.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/DefaultChangeWatcher.cs @@ -4,17 +4,15 @@ using System; using System.Collections.Generic; using System.ComponentModel; -using System.Diagnostics; using System.IO; using System.Linq; -using System.Text; using ICSharpCode.AvalonEdit.AddIn.MyersDiff; using ICSharpCode.AvalonEdit.Document; -using ICSharpCode.AvalonEdit.Rendering; using ICSharpCode.AvalonEdit.Utils; using ICSharpCode.SharpDevelop; using ICSharpCode.SharpDevelop.Editor; +using ICSharpCode.SharpDevelop.Editor.AvalonEdit; namespace ICSharpCode.AvalonEdit.AddIn { @@ -54,6 +52,12 @@ namespace ICSharpCode.AvalonEdit.AddIn if (baseFileStream != null) { // ReadAll() is taking care of closing the stream baseDocument = DocumentUtilitites.LoadReadOnlyDocumentFromBuffer(new StringTextBuffer(ReadAll(baseFileStream))); + } 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); + } } SetupInitialFileState(false); @@ -187,5 +191,19 @@ namespace ICSharpCode.AvalonEdit.AddIn disposed = true; } } + + public IList GetDiffsByLine(int line) + { + var result = new List(); + + if (baseDocument.TotalNumberOfLines < line) + result.Add(null); + else + result.Add(baseDocument.GetLine(line)); + + result.Add(document.GetLine(line)); + + return result; + } } -} +} \ No newline at end of file diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/LineChangeInfo.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/LineChangeInfo.cs index b9e3e4755f..c3640532d6 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/LineChangeInfo.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/LineChangeInfo.cs @@ -2,6 +2,7 @@ // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) using System; +using System.Collections.Generic; using ICSharpCode.SharpDevelop.Editor; namespace ICSharpCode.AvalonEdit.AddIn @@ -16,6 +17,7 @@ namespace ICSharpCode.AvalonEdit.AddIn /// LineChangeInfo GetChange(int lineNumber); void Initialize(IDocument document); + IList GetDiffsByLine(int line); } public enum ChangeType