use of org.rstudio.studio.client.workbench.views.source.editors.text.AceEditor in project rstudio by rstudio.
the class EditSnippetsDialog method createMainWidget.
@Override
protected Widget createMainWidget() {
panel_ = new DockLayoutPanel(Unit.PX);
// compute the widget size and set it
Size size = new Size(900, 900);
size = DomMetrics.adjustedElementSize(size, null, // pad
70, // client margin
100);
panel_.setWidth(size.width + "px");
panel_.setHeight(size.height + "px");
// snippet types
snippetTypes_ = new WidgetListBox<EditableSnippets>();
snippetTypes_.addChangeHandler(new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
updateEditor(snippetTypes_.getSelectedItem());
}
});
snippetTypes_.addItem(new EditableSnippets("R", FileTypeRegistry.R));
snippetTypes_.addItem(new EditableSnippets(FileTypeRegistry.CPP));
snippetTypes_.addItem(new EditableSnippets(FileTypeRegistry.MARKDOWN));
snippetTypes_.addItem(new EditableSnippets(FileTypeRegistry.TEX));
snippetTypes_.addItem(new EditableSnippets(FileTypeRegistry.JS));
snippetTypes_.addItem(new EditableSnippets(FileTypeRegistry.HTML));
snippetTypes_.addItem(new EditableSnippets(FileTypeRegistry.CSS));
snippetTypes_.addItem(new EditableSnippets(FileTypeRegistry.SQL));
snippetTypes_.addItem(new EditableSnippets(FileTypeRegistry.JAVA));
snippetTypes_.addItem(new EditableSnippets(FileTypeRegistry.PYTHON));
snippetTypes_.addItem(new EditableSnippets(FileTypeRegistry.STAN));
panel_.addWest(snippetTypes_, 150);
// editor
docDisplay_ = new AceEditor();
docDisplay_.setUseSoftTabs(false);
docDisplay_.setTabSize(uiPrefs_.numSpacesForTab().getValue());
docDisplay_.addValueChangeHandler(new ValueChangeHandler<Void>() {
@Override
public void onValueChange(ValueChangeEvent<Void> event) {
editorDirty_ = true;
}
});
docDisplay_.setFileType(FileTypeRegistry.SNIPPETS);
SimplePanel panel = new SimplePanel();
panel.addStyleName("EditDialog");
panel.getElement().getStyle().setMarginLeft(8, Unit.PX);
panel.setWidget(docDisplay_.asWidget());
panel_.add(panel);
TextEditingTarget.syncFontSize(releaseOnDismiss_, events_, this, fontSizeManager_);
snippetTypes_.setSelectedIndex(0, true);
return panel_;
}
use of org.rstudio.studio.client.workbench.views.source.editors.text.AceEditor in project rstudio by rstudio.
the class RCompletionManager method addAutocompletionContextForDollar.
private boolean addAutocompletionContextForDollar(AutocompletionContext context) {
// Establish an evaluation context by looking backwards
AceEditor editor = (AceEditor) docDisplay_;
if (editor == null)
return false;
CodeModel codeModel = editor.getSession().getMode().getRCodeModel();
codeModel.tokenizeUpToRow(input_.getCursorPosition().getRow());
TokenCursor cursor = codeModel.getTokenCursor();
if (!cursor.moveToPosition(input_.getCursorPosition()))
return false;
// Move back to the '$'
while (cursor.currentValue() != "$" && cursor.currentValue() != "@") if (!cursor.moveToPreviousToken())
return false;
int type = cursor.currentValue() == "$" ? AutocompletionContext.TYPE_DOLLAR : AutocompletionContext.TYPE_AT;
// Put a cursor here
TokenCursor contextEndCursor = cursor.cloneCursor();
// We allow for arbitrary elements previous, so we want to get e.g.
//
// env::foo()$bar()[1]$baz
// Get the string forming the context
//
//
// If this fails, we still want to report an empty evaluation context
// (the completion is still occurring in a '$' context, so we do want
// to exclude completions from other scopes)
String data = "";
if (cursor.moveToPreviousToken() && cursor.findStartOfEvaluationContext()) {
data = editor.getTextForRange(Range.fromPoints(cursor.currentPosition(), contextEndCursor.currentPosition()));
}
context.add(data, type);
return true;
}
use of org.rstudio.studio.client.workbench.views.source.editors.text.AceEditor in project rstudio by rstudio.
the class RCompletionManager method beginSuggest.
/**
* If false, the suggest operation was aborted
*/
private boolean beginSuggest(boolean flushCache, boolean implicit, boolean canAutoInsert) {
suggestTimer_.cancel();
if (!input_.isSelectionCollapsed())
return false;
invalidatePendingRequests(flushCache, false);
InputEditorSelection selection = input_.getSelection();
if (selection == null)
return false;
int cursorCol = selection.getStart().getPosition();
String firstLine = input_.getText().substring(0, cursorCol);
// of roxygen comments (e.g. at "#' |")
if (isLineInComment(firstLine) && !isLineInRoxygenComment(firstLine))
return false;
// if the insertion character was a tab (unless the user has opted in)
if (!uiPrefs_.allowTabMultilineCompletion().getValue()) {
if (nativeEvent_ != null && nativeEvent_.getKeyCode() == KeyCodes.KEY_TAB)
if (firstLine.matches("^\\s*$"))
return false;
}
AutocompletionContext context = getAutocompletionContext();
// but is effectively a bandaid until the autocompletion revamp.
if (context.getToken().startsWith("-"))
context.setToken(context.getToken().substring(1));
// the comment marker
if (context.getToken().equals("'@"))
context.setToken(context.getToken().substring(1));
context_ = new CompletionRequestContext(invalidation_.getInvalidationToken(), selection, canAutoInsert);
RInfixData infixData = RInfixData.create();
AceEditor editor = (AceEditor) docDisplay_;
if (editor != null) {
CodeModel codeModel = editor.getSession().getMode().getRCodeModel();
TokenCursor cursor = codeModel.getTokenCursor();
if (cursor.moveToPosition(input_.getCursorPosition())) {
String token = "";
if (cursor.hasType("identifier"))
token = cursor.currentValue();
String cursorPos = "left";
if (cursor.currentValue() == "=")
cursorPos = "right";
TokenCursor clone = cursor.cloneCursor();
if (clone.moveToPreviousToken())
if (clone.currentValue() == "=")
cursorPos = "right";
// Try to get a dplyr join completion
DplyrJoinContext joinContext = codeModel.getDplyrJoinContextFromInfixChain(cursor);
// If that failed, try a non-infix lookup
if (joinContext == null) {
String joinString = getDplyrJoinString(editor, cursor);
if (!StringUtil.isNullOrEmpty(joinString)) {
requester_.getDplyrJoinCompletionsString(token, joinString, cursorPos, implicit, context_);
return true;
}
} else {
requester_.getDplyrJoinCompletions(joinContext, implicit, context_);
return true;
}
// completions
if (cursor.moveToPosition(input_.getCursorPosition()))
infixData = codeModel.getDataFromInfixChain(cursor);
}
}
String filePath = getSourceDocumentPath();
String docId = getSourceDocumentId();
requester_.getCompletions(context.getToken(), context.getAssocData(), context.getDataType(), context.getNumCommas(), context.getFunctionCallString(), infixData.getDataName(), infixData.getAdditionalArgs(), infixData.getExcludeArgs(), infixData.getExcludeArgsFromObject(), filePath, docId, implicit, context_);
return true;
}
use of org.rstudio.studio.client.workbench.views.source.editors.text.AceEditor in project rstudio by rstudio.
the class RCompletionManager method getCurrentCompletionToken.
String getCurrentCompletionToken() {
AceEditor editor = (AceEditor) docDisplay_;
if (editor == null)
return "";
// `r foo`
if (DocumentMode.isCursorInMarkdownMode(docDisplay_))
return token_;
Position cursorPos = editor.getCursorPosition();
Token currentToken = editor.getSession().getTokenAt(cursorPos);
if (currentToken == null)
return "";
// If the user has inserted some spaces, the cursor might now lie
// on a 'text' token. In that case, find the previous token and
// use that for completion.
String suffix = "";
if (currentToken.getValue().trim().isEmpty()) {
suffix = currentToken.getValue();
TokenIterator it = editor.createTokenIterator();
it.moveToPosition(cursorPos);
Token token = it.stepBackward();
if (token != null)
currentToken = token;
}
// Exclude non-string and non-identifier tokens.
if (currentToken.hasType("operator", "comment", "numeric", "text", "punctuation"))
return "";
String tokenValue = currentToken.getValue();
String subsetted = tokenValue.substring(0, cursorPos.getColumn() - currentToken.getColumn());
return subsetted + suffix;
}
use of org.rstudio.studio.client.workbench.views.source.editors.text.AceEditor in project rstudio by rstudio.
the class Source method getEditorContext.
private void getEditorContext(String id, String path, DocDisplay docDisplay) {
AceEditor editor = (AceEditor) docDisplay;
Selection selection = editor.getNativeSelection();
Range[] ranges = selection.getAllRanges();
JsArray<DocumentSelection> docSelections = JavaScriptObject.createArray().cast();
for (int i = 0; i < ranges.length; i++) {
docSelections.push(DocumentSelection.create(ranges[i], editor.getTextForRange(ranges[i])));
}
id = StringUtil.notNull(id);
path = StringUtil.notNull(path);
GetEditorContextEvent.SelectionData data = GetEditorContextEvent.SelectionData.create(id, path, editor.getCode(), docSelections);
server_.getEditorContextCompleted(data, new VoidServerRequestCallback());
}
Aggregations