/* * NewConnectionShinyHost.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.workbench.views.connections.ui; import org.rstudio.core.client.Debug; import org.rstudio.core.client.StringUtil; import org.rstudio.core.client.widget.Operation; import org.rstudio.core.client.widget.ProgressIndicator; import org.rstudio.core.client.widget.RStudioFrame; import org.rstudio.studio.client.RStudioGinjector; import org.rstudio.studio.client.application.Desktop; import org.rstudio.studio.client.application.events.EventBus; import org.rstudio.studio.client.common.GlobalDisplay; import org.rstudio.studio.client.common.shiny.model.ShinyServerOperations; 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.server.remote.RResult; import org.rstudio.studio.client.shiny.events.ShinyFrameNavigatedEvent; import org.rstudio.studio.client.workbench.views.connections.events.NewConnectionDialogUpdatedEvent; import org.rstudio.studio.client.workbench.views.connections.model.ConnectionOptions; import org.rstudio.studio.client.workbench.views.connections.model.ConnectionsServerOperations; import org.rstudio.studio.client.workbench.views.connections.model.NewConnectionContext.NewConnectionInfo; import com.google.gwt.core.client.GWT; import com.google.gwt.resources.client.ClientBundle; import com.google.gwt.resources.client.CssResource; import com.google.gwt.user.client.Command; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.Grid; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; import com.google.inject.Inject; public class NewConnectionShinyHost extends Composite implements ShinyFrameNavigatedEvent.Handler, NewConnectionDialogUpdatedEvent.Handler { @Inject private void initialize(EventBus events, GlobalDisplay globalDisplay, ConnectionsServerOperations server, ShinyServerOperations shinyServer) { events_ = events; globalDisplay_ = globalDisplay; server_ = server; shinyServer_ = shinyServer; } public void onBeforeActivate(Operation operation, NewConnectionInfo info) { events_.addHandler(ShinyFrameNavigatedEvent.TYPE, this); events_.addHandler(NewConnectionDialogUpdatedEvent.TYPE, this); initialize(operation, info); } public void onActivate(ProgressIndicator indicator) { } private void terminateShinyApp(final Operation operation) { shinyServer_.stopShinyApp(new ServerRequestCallback<Void>() { public void onResponseReceived(Void v) { operation.execute(); } @Override public void onError(ServerError error) { } }); } public void onDeactivate(Operation operation) { terminateShinyApp(operation); } public NewConnectionShinyHost() { RStudioGinjector.INSTANCE.injectMembers(this); initWidget(createWidget()); } private void showError(String errorMessage) { globalDisplay_.showErrorMessage("Error", errorMessage); } private void initialize(final Operation operation, final NewConnectionInfo info) { // initialize miniUI server_.launchEmbeddedShinyConnectionUI(info.getPackage(), info.getName(), new ServerRequestCallback<RResult<Void>>() { @Override public void onResponseReceived(RResult<Void> response) { if (response.failed()) { showError(response.errorMessage()); } else { operation.execute(); } } @Override public void onError(ServerError error) { Debug.logError(error); } }); } private Widget createWidget() { VerticalPanel container = new VerticalPanel(); // create iframe for miniUI frame_ = new RStudioFrame(); frame_.setSize("100%", "140px"); container.add(frame_); // add the code panel codePanel_ = new ConnectionCodePanel(); codePanel_.addStyleName(RES.styles().dialogCodePanel()); final Command updateCodeCommand = new Command() { @Override public void execute() { codePanel_.setCode("", null); } }; updateCodeCommand.execute(); Grid codeGrid = new Grid(1, 1); codeGrid.addStyleName(RES.styles().codeGrid()); codeGrid.setCellPadding(0); codeGrid.setCellSpacing(0); codeGrid.setWidget(0, 0, codePanel_); container.add(codeGrid); return container; } public ConnectionOptions collectInput() { // collect the result ConnectionOptions result = ConnectionOptions.create( codePanel_.getCode(), codePanel_.getConnectVia()); // return result return result; } @Override public void onShinyFrameNavigated(ShinyFrameNavigatedEvent event) { String url = event.getURL(); if (Desktop.isDesktop()) Desktop.getFrame().setShinyDialogUrl(url); frame_.setUrl(StringUtil.makeAbsoluteUrl(url)); } @Override public void onNewConnectionDialogUpdated(NewConnectionDialogUpdatedEvent event) { codePanel_.setCode(event.getCode(), ""); } public interface Styles extends CssResource { String helpLink(); String codeViewer(); String codeGrid(); String codePanelHeader(); String dialogCodePanel(); String infoPanel(); String leftLabel(); } public interface Resources extends ClientBundle { @Source("NewConnectionShinyHost.css") Styles styles(); } public static Resources RES = GWT.create(Resources.class); public static void ensureStylesInjected() { RES.styles().ensureInjected(); } private ConnectionCodePanel codePanel_; private EventBus events_; private RStudioFrame frame_; private GlobalDisplay globalDisplay_; private ConnectionsServerOperations server_; private ShinyServerOperations shinyServer_; }