/*
* TextEditingTargetCppHelper.java
*
* Copyright (C) 2009-12 by RStudio, Inc.
*
* Unless you have received this program directly from RStudio pursuant
* to the terms of a commercial license agreement with RStudio, then
* this program is licensed to you under the terms of version 3 of the
* GNU Affero General Public License. This program is distributed WITHOUT
* ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,
* MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the
* AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.
*
*/
package org.rstudio.studio.client.workbench.views.source.editors.text;
import org.rstudio.studio.client.RStudioGinjector;
import org.rstudio.studio.client.common.SimpleRequestCallback;
import org.rstudio.studio.client.common.filetypes.TextFileType;
import org.rstudio.studio.client.server.ServerError;
import org.rstudio.studio.client.server.ServerRequestCallback;
import org.rstudio.studio.client.server.Void;
import org.rstudio.studio.client.workbench.views.source.editors.EditingTarget;
import org.rstudio.studio.client.workbench.views.source.editors.text.cpp.CppCompletionContext;
import org.rstudio.studio.client.workbench.views.source.editors.text.cpp.CppCompletionOperation;
import org.rstudio.studio.client.workbench.views.source.editors.text.cpp.CppCompletionServerRequestCallback;
import org.rstudio.studio.client.workbench.views.source.model.CppCapabilities;
import org.rstudio.studio.client.workbench.views.source.model.CppServerOperations;
import com.google.inject.Inject;
public class TextEditingTargetCppHelper
{
public TextEditingTargetCppHelper(CppCompletionContext completionContext,
DocDisplay docDisplay)
{
completionContext_ = completionContext;
RStudioGinjector.INSTANCE.injectMembers(this);
}
@Inject
void initialize(CppServerOperations server)
{
server_ = server;
}
public void checkBuildCppDependencies(
final EditingTarget editingTarget,
final WarningBarDisplay warningBar,
TextFileType fileType)
{
// bail if this isn't a C file or we've already verified we can build
if (!fileType.isC() || capabilities_.hasAllCapabiliites())
return;
server_.getCppCapabilities(
new ServerRequestCallback<CppCapabilities>() {
@Override
public void onResponseReceived(CppCapabilities capabilities)
{
if (capabilities_.hasAllCapabiliites())
{
capabilities_ = capabilities;
}
else
{
if (!capabilities.getCanBuild())
{
warningBar.showWarningBar(
"The tools required to build C/C++ code for R " +
"are not currently installed");
// do a prompted install of the build tools
server_.installBuildTools(
"Compiling C/C++ code for R",
new SimpleRequestCallback<Boolean>() {
@Override
public void onResponseReceived(Boolean confirmed)
{
if (confirmed)
warningBar.hideWarningBar();
}
});
}
else if (!capabilities.getCanSourceCpp())
{
if (editingTarget.search("Rcpp\\:\\:export") != null)
{
warningBar.showWarningBar(
"The Rcpp package (version 0.10.1 or higher) is not " +
"currently installed");
}
}
}
}
@Override
public void onError(ServerError error)
{
// ignore error since this is merely advisory
}
});
}
public void findUsages()
{
completionContext_.cppCompletionOperation(new CppCompletionOperation() {
@Override
public void execute(String docPath, int line, int column)
{
server_.findCppUsages(
docPath,
line,
column,
new CppCompletionServerRequestCallback<Void>(
"Finding usages..."));
}
});
}
private CppServerOperations server_;
private final CppCompletionContext completionContext_;
// cache the value statically -- once we get an affirmative response
// we never check again
private static CppCapabilities capabilities_
= CppCapabilities.createDefault();
}