/*
* HelpStrategy.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.console.shell.assist;
import java.util.HashMap;
import org.rstudio.core.client.Debug;
import org.rstudio.studio.client.RStudioGinjector;
import org.rstudio.studio.client.common.codetools.CodeToolsServerOperations;
import org.rstudio.studio.client.common.codetools.RCompletionType;
import org.rstudio.studio.client.server.ServerError;
import org.rstudio.studio.client.server.ServerRequestCallback;
import org.rstudio.studio.client.workbench.views.console.shell.assist.CompletionRequester.QualifiedName;
import org.rstudio.studio.client.workbench.views.help.model.HelpInfo;
import org.rstudio.studio.client.workbench.views.help.model.HelpInfo.ParsedInfo;
import com.google.inject.Inject;
import com.google.inject.Singleton;
@Singleton
public class HelpStrategy
{
final CodeToolsServerOperations server_;
@Inject
public HelpStrategy(CodeToolsServerOperations server)
{
server_ = server;
cache_ = new HashMap<QualifiedName, ParsedInfo>();
}
public void showHelpTopic(final QualifiedName selectedItem)
{
if (selectedItem.helpHandler != null)
{
server_.showCustomHelpTopic(selectedItem.helpHandler,
selectedItem.name,
selectedItem.source);
}
else
{
server_.showHelpTopic(
selectedItem.name,
selectedItem.source,
selectedItem.type);
}
}
public void showHelp(final QualifiedName item,
final CompletionPopupDisplay display)
{
switch (item.type)
{
case RCompletionType.PACKAGE:
showPackageHelp(item, display);
break;
case RCompletionType.ARGUMENT:
case RCompletionType.OPTION:
showParameterHelp(item, display);
break;
default:
showDefaultHelp(item, display);
break;
}
}
public void clearCache()
{
cache_.clear();
}
private void showDefaultHelp(final QualifiedName selectedItem,
final CompletionPopupDisplay display)
{
ParsedInfo cachedHelp = cache_.get(selectedItem);
if (cachedHelp != null)
{
display.displayHelp(cachedHelp);
return;
}
if (selectedItem.helpHandler != null)
{
// call server
server_.getCustomHelp(selectedItem.helpHandler,
selectedItem.name,
selectedItem.source,
new ServerRequestCallback<HelpInfo.Custom>() {
@Override
public void onError(ServerError error)
{
Debug.logError(error);
RStudioGinjector.INSTANCE.getGlobalDisplay().showErrorMessage(
"Error Retrieving Help", error.getUserMessage());
display.clearHelp(false) ;
}
public void onResponseReceived(HelpInfo.Custom result)
{
if (result != null)
{
HelpInfo.ParsedInfo help = result.toParsedInfo();
if (help.hasInfo())
{
cache_.put(selectedItem, help);
display.displayHelp(help) ;
return;
}
}
display.setHelpVisible(false);
display.clearHelp(false) ;
}
}) ;
}
else
{
server_.getHelp(selectedItem.name,
selectedItem.source,
selectedItem.type,
new ServerRequestCallback<HelpInfo>() {
@Override
public void onError(ServerError error)
{
Debug.logError(error);
RStudioGinjector.INSTANCE.getGlobalDisplay().showErrorMessage(
"Error Retrieving Help", error.getUserMessage());
display.clearHelp(false) ;
}
public void onResponseReceived(HelpInfo result)
{
if (result != null)
{
HelpInfo.ParsedInfo help = result.parse(selectedItem.name) ;
if (help.hasInfo())
{
cache_.put(selectedItem, help);
display.displayHelp(help) ;
return;
}
}
display.setHelpVisible(false);
display.clearHelp(false) ;
}
}) ;
}
}
private void showParameterHelp(final QualifiedName selectedItem,
final CompletionPopupDisplay display)
{
final String name = selectedItem.name.replaceAll("\\s*=\\s*$", "");
ParsedInfo cachedHelp = cache_.get(selectedItem);
if (cachedHelp != null)
{
doShowParameterHelp(cachedHelp, name, display);
return;
}
if (selectedItem.helpHandler != null)
{
server_.getCustomParameterHelp(
selectedItem.helpHandler,
selectedItem.source,
new ServerRequestCallback<HelpInfo.Custom>() {
@Override
public void onError(ServerError error)
{
display.clearHelp(false) ;
}
public void onResponseReceived(HelpInfo.Custom response)
{
if (response != null)
{
HelpInfo.ParsedInfo info = response.toParsedInfo();
cache_.put(selectedItem, info);
doShowParameterHelp(info, name, display);
}
else
{
display.setHelpVisible(false);
display.clearHelp(false) ;
}
}
}) ;
}
else
{
server_.getHelp(selectedItem.source,
null,
selectedItem.type,
new ServerRequestCallback<HelpInfo>() {
@Override
public void onError(ServerError error)
{
display.clearHelp(false) ;
}
@Override
public void onResponseReceived(HelpInfo response)
{
if (response != null)
{
ParsedInfo info = response.parse(selectedItem.source);
cache_.put(selectedItem, info);
doShowParameterHelp(info, name, display);
}
else
{
display.setHelpVisible(false);
display.clearHelp(false);
}
}
}) ;
}
}
private void doShowParameterHelp(final ParsedInfo info,
final String parameter,
final CompletionPopupDisplay display)
{
String desc = null;
HashMap<String, String> mapToUse = info.getArgs();
if (mapToUse != null)
{
desc = mapToUse.get(parameter) ;
}
if (desc == null)
{
mapToUse = info.getSlots();
if (mapToUse != null)
{
desc = mapToUse.get(parameter);
}
}
if (desc == null)
{
display.setHelpVisible(false);
display.clearHelp(false) ;
}
else
{
display.displayParameterHelp(mapToUse, parameter) ;
}
}
@SuppressWarnings("unused")
private void showDataHelp(final QualifiedName selectedItem,
final CompletionPopupDisplay display)
{
ParsedInfo cachedHelp = cache_.get(selectedItem);
if (cachedHelp != null)
{
doShowDataHelp(cachedHelp, display);
return;
}
server_.getHelp(
selectedItem.name,
selectedItem.source,
selectedItem.type,
new ServerRequestCallback<HelpInfo>() {
@Override
public void onError(ServerError error)
{
display.clearHelp(false) ;
}
@Override
public void onResponseReceived(HelpInfo response)
{
if (response != null)
{
ParsedInfo info = response.parse(selectedItem.name);
cache_.put(selectedItem, info);
doShowDataHelp(info, display);
}
else
{
display.setHelpVisible(false);
display.clearHelp(false);
}
}
}) ;
}
private void doShowDataHelp(final ParsedInfo info,
final CompletionPopupDisplay display)
{
if (info.hasInfo())
{
display.displayDataHelp(info) ;
}
else
{
display.setHelpVisible(false);
display.clearHelp(false) ;
}
}
private void showPackageHelp(final QualifiedName selectedItem,
final CompletionPopupDisplay display)
{
ParsedInfo cachedHelp = cache_.get(selectedItem);
if (cachedHelp != null)
{
doShowPackageHelp(cachedHelp, display);
return;
}
final String packageName = selectedItem.name;
server_.getHelp(
packageName,
null,
selectedItem.type,
new ServerRequestCallback<HelpInfo>() {
@Override
public void onError(ServerError error)
{
display.clearHelp(false) ;
}
@Override
public void onResponseReceived(HelpInfo response)
{
if (response != null)
{
ParsedInfo info = response.parse(packageName);
cache_.put(selectedItem, info);
doShowPackageHelp(info, display);
}
else
{
display.setHelpVisible(false);
display.clearHelp(false);
}
}
}) ;
}
private void doShowPackageHelp(final ParsedInfo info,
final CompletionPopupDisplay display)
{
if (info.hasInfo())
{
display.displayPackageHelp(info) ;
}
else
{
display.setHelpVisible(false);
display.clearHelp(false) ;
}
}
HashMap<QualifiedName, ParsedInfo> cache_;
}