protected override void OnTextViewDisconnected(ITextView textView, ITextBuffer textBuffer) { if (textBuffer != textView.TextBuffer) { var containedLanguageHost = ContainedLanguageHost.GetHost(textView, textBuffer); if (containedLanguageHost != null) { containedLanguageHost.RemoveContainedCommandTarget(textView); } } base.OnTextViewDisconnected(textView, textBuffer); }
protected override void OnTextViewConnected(ITextView textView, ITextBuffer textBuffer) { var mainController = ServiceManager.GetService <TemplateMainController>(textView) ?? new TemplateMainController(textView, textBuffer); if (textBuffer != textView.TextBuffer) { var containedLanguageHost = ContainedLanguageHost.GetHost(textView, textBuffer); if (containedLanguageHost != null) { object nextFilter = containedLanguageHost.SetContainedCommandTarget(textView, mainController); mainController.ChainedController = WebEditor.TranslateCommandTarget(textView, nextFilter); } } base.OnTextViewConnected(textView, textBuffer); }
protected override void OnTextViewConnected(ITextView textView, ITextBuffer textBuffer) { RMainController.Attach(textView, textBuffer, Shell); if (textBuffer != textView.TextBuffer) { // Projected scenario _containedLanguageHost = ContainedLanguageHost.GetHost(textView, textBuffer, Shell); if (_containedLanguageHost != null) { _containedLanguageHost.Closing += OnContainedLanguageHostClosing; _textBuffer = textBuffer; var mainController = RMainController.FromTextView(textView); var nextTarget = _containedLanguageHost.SetContainedCommandTarget(textView, mainController); // Convert chained target to ICommandTarget (chained target might be IOleCommandTarget and host will create a shim then). mainController.ChainedController = nextTarget; } } base.OnTextViewConnected(textView, textBuffer); }
private static bool CanFormatRange(ITextView textView, ITextBuffer textBuffer, ITextRange formatRange) { // Make sure we are not formatting damaging the projected range in R Markdown // which looks like ```{r. 'r' should not separate from {. var host = ContainedLanguageHost.GetHost(textView, textBuffer); if (host != null) { ITextSnapshot snapshot = textBuffer.CurrentSnapshot; int startLine = snapshot.GetLineNumberFromPosition(formatRange.Start); int endLine = snapshot.GetLineNumberFromPosition(formatRange.End); for (int i = startLine; i <= endLine; i++) { if (!host.CanFormatLine(textView, textBuffer, i)) { return(false); } } } return(true); }
public static void HandleAutoformat(ITextView textView, IEditorShell editorShell, char typedChar) { if (!REditorSettings.AutoFormat) { return; } if (!REditorSettings.FormatScope && typedChar == '}') { return; } SnapshotPoint?rPoint = GetCaretPointInBuffer(textView); if (!rPoint.HasValue) { return; } var document = REditorDocument.FromTextBuffer(textView.TextBuffer); var ast = document.EditorTree.AstRoot; // Make sure we are not formatting damaging the projected range in R Markdown // which looks like ```{r. 'r' should not separate from {. var host = ContainedLanguageHost.GetHost(textView, document.TextBuffer, editorShell); if (host != null && !host.CanFormatLine(textView, document.TextBuffer, document.TextBuffer.CurrentSnapshot.GetLineNumberFromPosition(rPoint.Value))) { return; } // We don't want to auto-format inside strings if (ast.IsPositionInsideString(rPoint.Value.Position)) { return; } ITextBuffer subjectBuffer = rPoint.Value.Snapshot.TextBuffer; if (typedChar.IsLineBreak()) { // Special case for hitting caret after } and before 'else'. We do want to format // the construct as '} else {' but if user types Enter after } and we auto-format // it will look as if the editor just eats the Enter. Instead, we will not be // autoformatting in this specific case. User can always format either the document // or select the block and reformat it. if (!IsBetweenCurlyAndElse(subjectBuffer, rPoint.Value.Position)) { var scopeStatement = GetFormatScope(textView, subjectBuffer, ast); // Do not format large scope blocks for performance reasons if (scopeStatement != null && scopeStatement.Length < 200) { FormatOperations.FormatNode(textView, subjectBuffer, editorShell, scopeStatement); } else if (CanFormatLine(textView, subjectBuffer, -1)) { FormatOperations.FormatViewLine(textView, subjectBuffer, -1, editorShell); } } } else if (typedChar == ';') { // Verify we are at the end of the string and not in a middle // of another string or inside a statement. ITextSnapshotLine line = subjectBuffer.CurrentSnapshot.GetLineFromPosition(rPoint.Value.Position); int positionInLine = rPoint.Value.Position - line.Start; string lineText = line.GetText(); if (positionInLine >= lineText.TrimEnd().Length) { FormatOperations.FormatViewLine(textView, subjectBuffer, 0, editorShell); } } else if (typedChar == '}') { FormatOperations.FormatCurrentStatement(textView, subjectBuffer, editorShell, limitAtCaret: true, caretOffset: -1); } }