public static CommandRange InnerBlock(TextEditorData editor, char openingChar, char closingChar) { var range = Block(editor, openingChar, closingChar); if (range.Length == 0) return CommandRange.Empty; int start = range.Start + 1; int end = range.End - 2; var line = editor.GetLine(editor.OffsetToLineNumber(range.Start)); // exclude newline if it comes just after opening char if (line.EndOffsetIncludingDelimiter - start <= line.DelimiterLength) start += line.DelimiterLength; // exclude whitespace that comes just before the closing char... line = editor.GetLine(editor.OffsetToLineNumber(range.End)); while (Char.IsWhiteSpace(editor.Text[end]) && end >= line.Offset) end--; //.. but only if newline comes after it if (end >= line.Offset) end = range.End - 2; else end -= line.PreviousLine.DelimiterLength; if (start > end + 1) return new CommandRange(start, start); return new CommandRange(start, end+1); }
/// <summary> /// Gets the outermost closed fold pertaining to the current caret position /// </summary> static FoldSegment GetOutermostClosedFold (TextEditorData data) { FoldSegment currentFold = null; int endOffset = -1, startOffset = int.MaxValue; IEnumerable<FoldSegment> folds = data.Document.GetFoldingContaining (data.Caret.Line); int lineNumber = data.LogicalToVisualLocation (data.Caret.Location).Line; if (null != folds) { foreach (FoldSegment fold in folds) { if (fold.IsFolded && data.LogicalToVisualLine (data.OffsetToLineNumber (fold.Offset)) == lineNumber && fold.Offset <= startOffset && fold.EndOffset >= endOffset) { currentFold = fold; startOffset = fold.Offset; endOffset = fold.EndOffset; } } } return currentFold; }
/// <summary> /// Gets the outermost closed fold pertaining to the current caret position /// </summary> static FoldSegment GetOutermostClosedFold(TextEditorData data) { FoldSegment currentFold = null; int endOffset = -1, startOffset = int.MaxValue; IEnumerable <FoldSegment> folds = data.Document.GetFoldingContaining(data.Caret.Line); int lineNumber = data.LogicalToVisualLocation(data.Caret.Location).Line; if (null != folds) { foreach (FoldSegment fold in folds) { if (fold.IsFolded && data.LogicalToVisualLine(data.OffsetToLineNumber(fold.Offset)) == lineNumber && fold.Offset <= startOffset && fold.EndOffset >= endOffset) { currentFold = fold; startOffset = fold.Offset; endOffset = fold.EndOffset; } } } return(currentFold); }
int CorrectFormatting (TextEditorData data, int start, int end) { int delta = 0; int lineNumber = data.OffsetToLineNumber (start); LineSegment line = data.GetLine (lineNumber); if (line.Offset < start) lineNumber++; line = data.GetLine (lineNumber); if (line == null) return 0; bool wholeDocument = end >= data.Document.Length; do { string indent = line.GetIndentation (data.Document); StringBuilder newIndent = new StringBuilder (); int col = 1; if (data.Options.TabsToSpaces) { foreach (char ch in indent) { if (ch == '\t') { int tabWidth = TextViewMargin.GetNextTabstop (data, col) - col; newIndent.Append (new string (' ', tabWidth)); col += tabWidth; } else { newIndent.Append (ch); } } } else { for (int i = 0; i < indent.Length; i++) { char ch = indent [i]; if (ch == '\t') { int tabWidth = TextViewMargin.GetNextTabstop (data, col) - col; newIndent.Append (ch); col += tabWidth; } else { int tabWidth = TextViewMargin.GetNextTabstop (data, col) - col; newIndent.Append ('\t'); col += tabWidth; while (tabWidth-- > 0 && i + 1 < indent.Length) { if (indent [i + 1] != ' ') break; i++; } } } } if (indent.Length == line.EditableLength) newIndent.Length = 0; if (line.DelimiterLength != 0) { delta -= line.DelimiterLength; delta += data.EolMarker.Length; data.Replace (line.Offset + line.EditableLength, line.DelimiterLength, data.EolMarker); if (!wholeDocument) { end -= line.DelimiterLength; end += data.EolMarker.Length; } } string replaceWith = newIndent.ToString (); if (indent != replaceWith) { int count = (indent ?? "").Length; delta -= count; delta += data.Replace (line.Offset, count, replaceWith); if (!wholeDocument) end = end - count + replaceWith.Length; } lineNumber++; line = data.GetLine (lineNumber); } while (line != null && (wholeDocument || line.EndOffset <= end)); return delta; }