use of org.rstudio.studio.client.workbench.views.source.editors.text.AceEditor in project rstudio by rstudio.
the class SignatureToolTipManager method resolveActiveFunctionAndDisplayToolTip.
public void resolveActiveFunctionAndDisplayToolTip() {
if (suppressed_) {
suppressed_ = false;
return;
}
if (docDisplay_.isPopupVisible())
return;
AceEditor editor = (AceEditor) docDisplay_;
if (editor == null)
return;
final Position position = getLookupPosition();
final boolean isMouseEvent = isMouseDrivenEvent();
// Ensure that the mouse target is actually the active editor
if (isMouseEvent) {
Element el = DomUtils.elementFromPoint(coordinates_.getMouseX(), coordinates_.getMouseY());
AceEditorNative nativeEditor = AceEditorNative.getEditor(el);
if (nativeEditor != null && nativeEditor != editor.getWidget().getEditor())
return;
}
// and then later moves the mouse away)
if (isMouseEvent)
toolTip_.hide();
TokenCursor cursor = editor.getSession().getMode().getRCodeModel().getTokenCursor();
if (!cursor.moveToPosition(position, true))
return;
// position is not changed.
if (!isMouseEvent && uiPrefs_.showFunctionTooltipOnIdle().getGlobalValue() && !cursor.valueEquals("(")) {
cursor.findOpeningBracket("(", false);
}
Token lookahead = cursor.peekFwd(1);
if (lookahead.valueEquals("::") || lookahead.valueEquals(":::"))
if (!cursor.moveToNextToken())
return;
if (cursor.valueEquals("::") || cursor.valueEquals(":::"))
if (!cursor.moveToNextToken())
return;
if (cursor.valueEquals("("))
if (!cursor.moveToPreviousToken())
return;
// then bail.
if (toolTip_.isShowing() && cursor.currentPosition().isEqualTo(completionPosition_)) {
return;
}
completionPosition_ = cursor.currentPosition();
// be an opening paren.
if (!cursor.hasType("identifier"))
return;
if (!cursor.nextValue().equals("("))
return;
String callString = cursor.currentValue();
if (isBoringFunction(callString))
return;
// If this is a namespaced function call, then append that context.
Token lookbehind = cursor.peekBwd(1);
if (lookbehind.valueEquals("::") || lookbehind.valueEquals(":::")) {
// Do-while loop just to allow 'break' for control flow
do {
TokenCursor clone = cursor.cloneCursor();
if (!clone.moveToPreviousToken())
break;
if (!clone.moveToPreviousToken())
break;
if (!clone.hasType("identifier"))
break;
callString = clone.currentValue() + "::" + callString;
} while (false);
}
// Set anchor (so we can dismiss popup when cursor moves outside
// of anchored region)
setAnchor(cursor.cloneCursor());
final String fnString = callString;
server_.getArgs(fnString, "", "", new ServerRequestCallback<String>() {
@Override
public void onResponseReceived(String arguments) {
if (StringUtil.isNullOrEmpty(arguments))
return;
final String signature = fnString + arguments;
resolvePositionAndShow(signature, position);
}
@Override
public void onError(ServerError error) {
Debug.logError(error);
}
});
}
Aggregations