Search in sources :

Example 6 with AceEditor

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_;
}
Also used : ChangeEvent(com.google.gwt.event.dom.client.ChangeEvent) ValueChangeEvent(com.google.gwt.event.logical.shared.ValueChangeEvent) DockLayoutPanel(com.google.gwt.user.client.ui.DockLayoutPanel) ValueChangeHandler(com.google.gwt.event.logical.shared.ValueChangeHandler) ChangeHandler(com.google.gwt.event.dom.client.ChangeHandler) Size(org.rstudio.core.client.Size) SimplePanel(com.google.gwt.user.client.ui.SimplePanel) AceEditor(org.rstudio.studio.client.workbench.views.source.editors.text.AceEditor) Void(org.rstudio.studio.client.server.Void)

Example 7 with AceEditor

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;
}
Also used : TokenCursor(org.rstudio.studio.client.workbench.views.source.editors.text.ace.TokenCursor) CodeModel(org.rstudio.studio.client.workbench.views.source.editors.text.ace.CodeModel) AceEditor(org.rstudio.studio.client.workbench.views.source.editors.text.AceEditor)

Example 8 with AceEditor

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;
}
Also used : InputEditorSelection(org.rstudio.studio.client.workbench.views.console.shell.editor.InputEditorSelection) DplyrJoinContext(org.rstudio.studio.client.workbench.views.source.editors.text.ace.DplyrJoinContext) TokenCursor(org.rstudio.studio.client.workbench.views.source.editors.text.ace.TokenCursor) RInfixData(org.rstudio.studio.client.workbench.views.source.editors.text.ace.RInfixData) CodeModel(org.rstudio.studio.client.workbench.views.source.editors.text.ace.CodeModel) AceEditor(org.rstudio.studio.client.workbench.views.source.editors.text.AceEditor)

Example 9 with AceEditor

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;
}
Also used : TokenIterator(org.rstudio.studio.client.workbench.views.source.editors.text.ace.TokenIterator) InputEditorPosition(org.rstudio.studio.client.workbench.views.console.shell.editor.InputEditorPosition) Position(org.rstudio.studio.client.workbench.views.source.editors.text.ace.Position) SourcePosition(org.rstudio.studio.client.workbench.views.source.model.SourcePosition) InputEditorLineWithCursorPosition(org.rstudio.studio.client.workbench.views.console.shell.editor.InputEditorLineWithCursorPosition) AceEditor(org.rstudio.studio.client.workbench.views.source.editors.text.AceEditor) Token(org.rstudio.studio.client.workbench.views.source.editors.text.ace.Token)

Example 10 with AceEditor

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());
}
Also used : GetEditorContextEvent(org.rstudio.studio.client.events.GetEditorContextEvent) DocumentSelection(org.rstudio.studio.client.events.GetEditorContextEvent.DocumentSelection) Selection(org.rstudio.studio.client.workbench.views.source.editors.text.ace.Selection) VoidServerRequestCallback(org.rstudio.studio.client.server.VoidServerRequestCallback) AceEditor(org.rstudio.studio.client.workbench.views.source.editors.text.AceEditor) Range(org.rstudio.studio.client.workbench.views.source.editors.text.ace.Range) DocumentSelection(org.rstudio.studio.client.events.GetEditorContextEvent.DocumentSelection)

Aggregations

AceEditor (org.rstudio.studio.client.workbench.views.source.editors.text.AceEditor)11 CodeModel (org.rstudio.studio.client.workbench.views.source.editors.text.ace.CodeModel)6 Position (org.rstudio.studio.client.workbench.views.source.editors.text.ace.Position)6 TokenCursor (org.rstudio.studio.client.workbench.views.source.editors.text.ace.TokenCursor)6 JsArrayString (com.google.gwt.core.client.JsArrayString)3 InputEditorLineWithCursorPosition (org.rstudio.studio.client.workbench.views.console.shell.editor.InputEditorLineWithCursorPosition)3 SourcePosition (org.rstudio.studio.client.workbench.views.source.model.SourcePosition)3 ServerError (org.rstudio.studio.client.server.ServerError)2 InputEditorPosition (org.rstudio.studio.client.workbench.views.console.shell.editor.InputEditorPosition)2 ScopeFunction (org.rstudio.studio.client.workbench.views.source.editors.text.ScopeFunction)2 Token (org.rstudio.studio.client.workbench.views.source.editors.text.ace.Token)2 Element (com.google.gwt.dom.client.Element)1 ChangeEvent (com.google.gwt.event.dom.client.ChangeEvent)1 ChangeHandler (com.google.gwt.event.dom.client.ChangeHandler)1 ValueChangeEvent (com.google.gwt.event.logical.shared.ValueChangeEvent)1 ValueChangeHandler (com.google.gwt.event.logical.shared.ValueChangeHandler)1 DockLayoutPanel (com.google.gwt.user.client.ui.DockLayoutPanel)1 SimplePanel (com.google.gwt.user.client.ui.SimplePanel)1 Size (org.rstudio.core.client.Size)1 FileSystemItem (org.rstudio.core.client.files.FileSystemItem)1