using ICSharpCode.AvalonEdit.Document; using ICSharpCode.AvalonEdit.Folding; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace TeamAAS_VP.Core { /// /// Allows producing foldings from a document based on braces. /// public class BraceFoldingStrategy { /// /// Gets/Sets the opening brace. The default value is '{'. /// public char OpeningBrace { get; set; } /// /// Gets/Sets the closing brace. The default value is '}'. /// public char ClosingBrace { get; set; } /// /// Creates a new BraceFoldingStrategy. /// public BraceFoldingStrategy() { this.OpeningBrace = '{'; this.ClosingBrace = '}'; } public void UpdateFoldings(FoldingManager manager, TextDocument document) { int firstErrorOffset; IEnumerable newFoldings = CreateNewFoldings(document, out firstErrorOffset); manager.UpdateFoldings(newFoldings, firstErrorOffset); } /// /// Create s for the specified document. /// public IEnumerable CreateNewFoldings(TextDocument document, out int firstErrorOffset) { firstErrorOffset = -1; return CreateNewFoldings(document); } /// /// Create s for the specified document. /// public IEnumerable CreateNewFoldings(ITextSource document) { List newFoldings = new List(); Stack startOffsets = new Stack(); 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=='#' && i+6< document.TextLength && document.GetCharAt(i+1)== 'r' && document.GetCharAt(i + 2) == 'e' && document.GetCharAt(i + 3) == 'g' && document.GetCharAt(i + 4) == 'i' && document.GetCharAt(i + 5) == 'o' && document.GetCharAt(i + 6) == 'n') { startOffsets.Push(i); } else if (c == '#' && i + 6 < document.TextLength && document.GetCharAt(i + 1) == 'e' && document.GetCharAt(i + 2) == 'n' && document.GetCharAt(i + 3) == 'd' && document.GetCharAt(i + 1) == 'r' && document.GetCharAt(i + 2) == 'e' && document.GetCharAt(i + 3) == 'g' && document.GetCharAt(i + 4) == 'i' && document.GetCharAt(i + 5) == 'o' && document.GetCharAt(i + 6) == 'n' && 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; } } }