/* * RStudioAPI.java * * Copyright (C) 2009-16 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.common.rstudioapi; import org.rstudio.core.client.MessageDisplay; import org.rstudio.core.client.MessageDisplay.PromptWithOptionResult; import org.rstudio.core.client.StringUtil; import org.rstudio.core.client.widget.HyperlinkLabel; import org.rstudio.core.client.widget.MessageDialog; import org.rstudio.core.client.widget.Operation; import org.rstudio.core.client.widget.ProgressIndicator; import org.rstudio.core.client.widget.ProgressOperationWithInput; import org.rstudio.studio.client.RStudioGinjector; import org.rstudio.studio.client.application.events.EventBus; import org.rstudio.studio.client.common.GlobalDisplay; import org.rstudio.studio.client.common.SimpleRequestCallback; import org.rstudio.studio.client.common.rstudioapi.events.RStudioAPIShowDialogEvent; import org.rstudio.studio.client.common.rstudioapi.model.RStudioAPIServerOperations; import com.google.gwt.core.client.GWT; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.resources.client.ClientBundle; import com.google.gwt.resources.client.CssResource; import com.google.gwt.safehtml.shared.SafeHtml; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.inject.Inject; import com.google.inject.Singleton; import org.rstudio.studio.client.server.Void; @Singleton public class RStudioAPI implements RStudioAPIShowDialogEvent.Handler { public RStudioAPI() { } @Inject private void initialize(EventBus events, GlobalDisplay globalDisplay, RStudioAPIServerOperations server) { events_ = events; globalDisplay_ = globalDisplay; server_ = server; events_.addHandler(RStudioAPIShowDialogEvent.TYPE, this); } public interface Styles extends CssResource { String textInfoWidget(); String installLink(); } public interface Resources extends ClientBundle { @Source("RStudioAPI.css") Styles styles(); } public static Resources RES = GWT.create(Resources.class); static { RES.styles().ensureInjected(); } private void showDialog(String caption, String message, final String url) { VerticalPanel verticalPanel = new VerticalPanel(); verticalPanel.addStyleName(RES.styles().textInfoWidget()); SafeHtml safeMsg = DialogHtmlSanitizer.sanitizeHtml(message); HTML msg = new HTML(safeMsg.asString()); msg.setWidth("100%"); verticalPanel.add(msg); if (!StringUtil.isNullOrEmpty(url)) { HyperlinkLabel link = new HyperlinkLabel(url, new ClickHandler() { @Override public void onClick(ClickEvent event) { RStudioGinjector.INSTANCE.getGlobalDisplay() .openWindow(url); } }); link.addStyleName(RES.styles().installLink()); verticalPanel.add(link); } MessageDialog dlg = new MessageDialog(MessageDialog.INFO, caption, verticalPanel ); dlg.addButton("OK", new Operation() { @Override public void execute() { server_.showDialogCompleted(null, false, new SimpleRequestCallback<Void>()); } }, true, false); dlg.showModal(); } private void showPrompt(String title, String message, String prompt) { if (StringUtil.isNullOrEmpty(prompt)) prompt = null; globalDisplay_.promptForTextWithOption( title, message, prompt, false, null, false, new ProgressOperationWithInput<PromptWithOptionResult>() { @Override public void execute(PromptWithOptionResult input, ProgressIndicator indicator) { indicator.onCompleted(); server_.showDialogCompleted(input.input, false, new SimpleRequestCallback<Void>()); } }, new Operation() { @Override public void execute() { server_.showDialogCompleted(null, false, new SimpleRequestCallback<Void>()); } }); } private void showQuestion(String title, String message, String ok, String cancel) { if (StringUtil.isNullOrEmpty(ok)) ok = "OK"; if (StringUtil.isNullOrEmpty(cancel)) cancel = "Cancel"; globalDisplay_.showYesNoMessage( MessageDialog.QUESTION, title, message, false, new Operation() { public void execute() { server_.showDialogCompleted(null, true, new SimpleRequestCallback<Void>()); } }, new Operation() { public void execute() { server_.showDialogCompleted(null, false, new SimpleRequestCallback<Void>()); } }, new Operation() { public void execute() { server_.showDialogCompleted(null, false, new SimpleRequestCallback<Void>()); } }, ok, cancel, true); } @Override public void onRStudioAPIShowDialogEvent(RStudioAPIShowDialogEvent event) { if (event.getPrompt()) { showPrompt( event.getTitle(), event.getMessage(), event.getPromptDefault()); } else if (event.getDialogIcon() == MessageDisplay.MSG_QUESTION) { showQuestion( event.getTitle(), event.getMessage(), event.getOK(), event.getCancel()); } else { showDialog( event.getTitle(), event.getMessage(), event.getUrl()); } } private EventBus events_; private GlobalDisplay globalDisplay_; private RStudioAPIServerOperations server_; }