Browse Source
Add TextEditorOptions.AllowScrollBelowDocument (enabled in SharpDevelop) to avoid the view from jumping when collapsing code near the end of document. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@4910 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61shortcuts
10 changed files with 378 additions and 128 deletions
@ -0,0 +1,67 @@
@@ -0,0 +1,67 @@
|
||||
// <file>
|
||||
// <copyright see="prj:///doc/copyright.txt"/>
|
||||
// <license see="prj:///doc/license.txt"/>
|
||||
// <owner name="Daniel Grunwald"/>
|
||||
// <version>$Revision$</version>
|
||||
// </file>
|
||||
|
||||
using System; |
||||
using ICSharpCode.AvalonEdit.Document; |
||||
using System.Collections.Generic; |
||||
|
||||
namespace ICSharpCode.AvalonEdit.Folding |
||||
{ |
||||
/// <summary>
|
||||
/// Allows producing foldings from a document based on braces.
|
||||
/// </summary>
|
||||
public class BraceFoldingStrategy |
||||
{ |
||||
/// <summary>
|
||||
/// Gets/Sets the opening brace. The default value is '{'.
|
||||
/// </summary>
|
||||
public char OpeningBrace { get; set; } |
||||
|
||||
/// <summary>
|
||||
/// Gets/Sets the closing brace. The default value is '}'.
|
||||
/// </summary>
|
||||
public char ClosingBrace { get; set; } |
||||
|
||||
/// <summary>
|
||||
/// Creates a new BraceFoldingStrategy.
|
||||
/// </summary>
|
||||
public BraceFoldingStrategy() |
||||
{ |
||||
this.OpeningBrace = '{'; |
||||
this.ClosingBrace = '}'; |
||||
} |
||||
|
||||
/// <summary>
|
||||
/// Create <see cref="NewFolding"/>s for the specified document.
|
||||
/// </summary>
|
||||
public IEnumerable<NewFolding> CreateNewFoldings(ITextSource document) |
||||
{ |
||||
List<NewFolding> newFoldings = new List<NewFolding>(); |
||||
|
||||
Stack<int> startOffsets = new Stack<int>(); |
||||
int lastNewLineOffset = 0; |
||||
char openingBrace = this.OpeningBrace; |
||||
char closingBrace = this.ClosingBrace; |
||||
for (int i = 0; i < document.TextLength; i++) { |
||||
char c = document.GetCharAt(i); |
||||
if (c == openingBrace) { |
||||
startOffsets.Push(i); |
||||
} else if (c == closingBrace && startOffsets.Count > 0) { |
||||
int startOffset = startOffsets.Pop(); |
||||
// don't fold if opening and closing brace are on the same line
|
||||
if (startOffset < lastNewLineOffset) { |
||||
newFoldings.Add(new NewFolding(startOffset, i + 1)); |
||||
} |
||||
} else if (c == '\n' || c == '\r') { |
||||
lastNewLineOffset = i + 1; |
||||
} |
||||
} |
||||
newFoldings.Sort((a,b) => a.StartOffset.CompareTo(b.StartOffset)); |
||||
return newFoldings; |
||||
} |
||||
} |
||||
} |
||||
@ -0,0 +1,67 @@
@@ -0,0 +1,67 @@
|
||||
// <file>
|
||||
// <copyright see="prj:///doc/copyright.txt"/>
|
||||
// <license see="prj:///doc/license.txt"/>
|
||||
// <author name="Daniel Grunwald"/>
|
||||
// <version>$Revision$</version>
|
||||
// </file>
|
||||
|
||||
using System; |
||||
using System.Collections.Generic; |
||||
using System.Collections.ObjectModel; |
||||
using System.Windows; |
||||
using System.Windows.Threading; |
||||
|
||||
using ICSharpCode.AvalonEdit.Document; |
||||
using ICSharpCode.AvalonEdit.Editing; |
||||
using ICSharpCode.AvalonEdit.Rendering; |
||||
using ICSharpCode.AvalonEdit.Utils; |
||||
|
||||
namespace ICSharpCode.AvalonEdit.Folding |
||||
{ |
||||
/// <summary>
|
||||
/// Helper class used for <see cref="FoldingManager.UpdateFoldings"/>.
|
||||
/// </summary>
|
||||
public sealed class NewFolding : ISegment |
||||
{ |
||||
/// <summary>
|
||||
/// Gets the start offset.
|
||||
/// </summary>
|
||||
public int StartOffset { get; private set; } |
||||
|
||||
/// <summary>
|
||||
/// Gets the end offset.
|
||||
/// </summary>
|
||||
public int EndOffset { get; private set; } |
||||
|
||||
/// <summary>
|
||||
/// Gets/Sets the name displayed for the folding.
|
||||
/// </summary>
|
||||
public string Name { get; set; } |
||||
|
||||
/// <summary>
|
||||
/// Gets/Sets whether the folding is closed by default.
|
||||
/// </summary>
|
||||
public bool DefaultClosed { get; set; } |
||||
|
||||
/// <summary>
|
||||
/// Creates a new NewFolding instance.
|
||||
/// </summary>
|
||||
public NewFolding(int start, int end) |
||||
{ |
||||
if (!(start < end)) |
||||
throw new ArgumentException("'start' must be less than 'end'"); |
||||
this.StartOffset = start; |
||||
this.EndOffset = end; |
||||
this.Name = null; |
||||
this.DefaultClosed = false; |
||||
} |
||||
|
||||
int ISegment.Offset { |
||||
get { return this.StartOffset; } |
||||
} |
||||
|
||||
int ISegment.Length { |
||||
get { return this.EndOffset - this.StartOffset; } |
||||
} |
||||
} |
||||
} |
||||
Loading…
Reference in new issue