diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditorView.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditorView.cs
index 17385ce748..e9921205be 100755
--- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditorView.cs
+++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditorView.cs
@@ -248,7 +248,7 @@ namespace ICSharpCode.AvalonEdit.AddIn
FoldingSection collapsedSection = foldingsAtOffset.FirstOrDefault(section => section.IsFolded);
if (collapsedSection != null) {
- args.SetToolTip(collapsedSection.TextContent);
+ args.SetToolTip(collapsedSection.TooltipText);
}
}
diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Folding/FoldingSection.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Folding/FoldingSection.cs
index afc9907a0d..f60e0db466 100644
--- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Folding/FoldingSection.cs
+++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Folding/FoldingSection.cs
@@ -2,6 +2,7 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
+using System.Text;
using System.Windows.Threading;
using ICSharpCode.AvalonEdit.Document;
using ICSharpCode.AvalonEdit.Rendering;
@@ -80,6 +81,63 @@ namespace ICSharpCode.AvalonEdit.Folding
}
}
+ ///
+ /// Gets the content of the collapsed lines as tooltip text.
+ ///
+ public string TooltipText {
+ get {
+ // This fixes SD-1394:
+ // Each line is checked for leading indentation whitespaces. If
+ // a line has the same or more indentation than the first line,
+ // it is reduced. If a line is less indented than the first line
+ // the indentation is removed completely.
+ //
+ // See the following example:
+ // line 1
+ // line 2
+ // line 3
+ // line 4
+ //
+ // is reduced to:
+ // line 1
+ // line 2
+ // line 3
+ // line 4
+
+ var startLine = manager.document.GetLineByOffset(StartOffset);
+ var endLine = manager.document.GetLineByOffset(EndOffset);
+ var builder = new StringBuilder();
+
+ var current = startLine;
+ ISegment startIndent = TextUtilities.GetLeadingWhitespace(manager.document, startLine);
+
+ while (current != endLine.NextLine) {
+ ISegment currentIndent = TextUtilities.GetLeadingWhitespace(manager.document, current);
+
+ if (current == startLine && current == endLine)
+ builder.Append(manager.document.GetText(StartOffset, EndOffset - StartOffset));
+ else if (current == startLine) {
+ if (current.EndOffset - StartOffset > 0)
+ builder.AppendLine(manager.document.GetText(StartOffset, current.EndOffset - StartOffset).TrimStart());
+ } else if (current == endLine) {
+ if (startIndent.Length <= currentIndent.Length)
+ builder.Append(manager.document.GetText(current.Offset + startIndent.Length, EndOffset - current.Offset - startIndent.Length));
+ else
+ builder.Append(manager.document.GetText(current.Offset + currentIndent.Length, EndOffset - current.Offset - currentIndent.Length));
+ } else {
+ if (startIndent.Length <= currentIndent.Length)
+ builder.AppendLine(manager.document.GetText(current.Offset + startIndent.Length, current.Length - startIndent.Length));
+ else
+ builder.AppendLine(manager.document.GetText(current.Offset + currentIndent.Length, current.Length - currentIndent.Length));
+ }
+
+ current = current.NextLine;
+ }
+
+ return builder.ToString();
+ }
+ }
+
///
/// Gets/Sets an additional object associated with this folding section.
///