/* * DefaultGlobalDisplay.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.common; import com.google.gwt.core.client.GWT; import com.google.gwt.http.client.URL; import com.google.gwt.user.client.Command; import com.google.gwt.user.client.ui.RootLayoutPanel; import com.google.inject.Inject; import com.google.inject.Provider; import org.rstudio.core.client.command.AppCommand; import org.rstudio.core.client.command.CommandHandler; import org.rstudio.core.client.dom.WindowEx; import org.rstudio.core.client.files.FileSystemItem; import org.rstudio.core.client.widget.*; import org.rstudio.studio.client.application.ApplicationView; import org.rstudio.studio.client.application.Desktop; import org.rstudio.studio.client.application.model.ApplicationServerOperations; import org.rstudio.core.client.widget.DialogBuilder; import org.rstudio.studio.client.common.dialog.DialogBuilderFactory; import org.rstudio.studio.client.workbench.commands.Commands; import org.rstudio.studio.client.workbench.model.Session; import org.rstudio.studio.client.workbench.model.SessionInfo; public class DefaultGlobalDisplay extends GlobalDisplay { @Inject public DefaultGlobalDisplay(Provider<ApplicationView> view, Commands commands, Session session, ApplicationServerOperations server) { view_ = view; session_ = session; server_ = server; commands.showWarningBar().addHandler(new CommandHandler() { public void onCommand(AppCommand command) { view_.get().showWarning(false, "This is a warning!"); } }); } @Override public void promptForText(String title, String label, String initialValue, final OperationWithInput<String> operation) { ((TextInput)GWT.create(TextInput.class)).promptForText( title, label, initialValue, false, false, -1, -1, null, new ProgressOperationWithInput<String>() { public void execute(String input, ProgressIndicator indicator) { indicator.onCompleted(); operation.execute(input); } }, null); } @Override public void promptForText(String title, String label, String initialValue, ProgressOperationWithInput<String> operation) { ((TextInput)GWT.create(TextInput.class)).promptForText( title, label, initialValue, false, false, -1, -1, null, operation, null); } @Override public void promptForText(String title, String label, String initialValue, int selectionOffset, int selectionLength, String okButtonCaption, ProgressOperationWithInput<String> operation) { ((TextInput)GWT.create(TextInput.class)).promptForText( title, label, initialValue, false, false, selectionOffset, selectionLength, okButtonCaption, operation, null); } @Override public void promptForTextWithOption( String title, String label, String initialValue, boolean usePasswordMask, String extraOptionPrompt, boolean extraOptionDefault, ProgressOperationWithInput<PromptWithOptionResult> okOperation, Operation cancelOperation) { ((TextInput)GWT.create(TextInput.class)).promptForTextWithOption( title, label, initialValue, usePasswordMask, extraOptionPrompt, extraOptionDefault, -1, -1, null, okOperation, cancelOperation); } @Override public void promptForInteger(String title, String label, Integer initialValue, final ProgressOperationWithInput<Integer> okOperation, Operation cancelOperation) { ((TextInput)GWT.create(TextInput.class)).promptForText( title, label, initialValue == null ? "" : initialValue.toString(), false, true, -1, -1, null, new ProgressOperationWithInput<String>() { @Override public void execute(String input, ProgressIndicator indicator) { int value = Integer.parseInt(input.trim()); okOperation.execute(value, indicator); } }, cancelOperation); } @Override protected DialogBuilder createDialog(int type, String caption, String message) { return ((DialogBuilderFactory)GWT.create(DialogBuilderFactory.class)) .create(type, caption, message); } public Command showProgress(String message) { return SlideLabel.show(message, false, true, RootLayoutPanel.get()); } public void showWarningBar(boolean severe, String message) { view_.get().showWarning(severe, message); } public void hideWarningBar() { view_.get().hideWarning(); } public ProgressIndicator getProgressIndicator(final String errorCaption) { return new ProgressIndicator() { public void onProgress(String message) { onProgress(message, null); } public void onProgress(String message, Operation onCancel) { dismissProgress(); dismissProgress_ = showProgress(message); } public void clearProgress() { dismissProgress(); } private void dismissProgress() { if (dismissProgress_ != null) dismissProgress_.execute(); dismissProgress_ = null; } public void onCompleted() { dismissProgress(); } public void onError(String message) { dismissProgress(); showMessage(GlobalDisplay.MSG_ERROR, errorCaption, message); } private Command dismissProgress_; }; } @Override public void openWindow(String url) { openWindow(url, null); } @Override public void openWindow(String url, NewWindowOptions options) { if (options == null) options = new NewWindowOptions(); windowOpener_.openWindow(this, url, options); } @Override public void openProgressWindow(String name, String message, OperationWithInput<WindowEx> openOperation) { String url = server_.getApplicationURL("progress"); url += "?message=" + URL.encodeQueryString(message); NewWindowOptions options = new NewWindowOptions(); options.setName(name); options.setCallback(openOperation); openWindow(url, options); } @Override public void openMinimalWindow(String url, int width, int height) { openMinimalWindow(url, false, width, height); } @Override public void openMinimalWindow(String url, boolean showLocation, int width, int height) { NewWindowOptions options = new NewWindowOptions(); options.setName("_blank"); options.setFocus(true); openMinimalWindow(url, showLocation, width, height, options); } @Override public void openMinimalWindow(String url, boolean showLocation, int width, int height, NewWindowOptions options) { windowOpener_.openMinimalWindow(this, url, options, width, height, showLocation); } @Override public void openWebMinimalWindow(String url, boolean showLocation, int width, int height, NewWindowOptions options) { windowOpener_.openWebMinimalWindow(this, url, options, width, height, showLocation); } @Override public void openSatelliteWindow(String name, int width, int height) { openSatelliteWindow(name, width, height, null); } @Override public void openSatelliteWindow(String name, int width, int height, NewWindowOptions options) { windowOpener_.openSatelliteWindow(this, name, width, height, options); } @Override public void openEmailComposeWindow(String to, String subject) { // determine gmail url String gmailURL = "https://mail.google.com/"; String user = session_.getSessionInfo().getUserIdentity(); if (user == null) // for desktop mode user = "foo@gmail.com"; String[] userComponents = user.split("@"); if ( (userComponents.length == 2) && ("gmail.com").equalsIgnoreCase(userComponents[1])) { gmailURL += "mail/"; } else { gmailURL += "a/" + userComponents[1] + "/"; } // calculate URL String url = gmailURL + "?fs=1&view=cm"; url += "&to=" + URL.encodeQueryString(to); if (subject != null) url += "&subject=" + URL.encodeQueryString(subject); // open window openWindow(url); } @Override public void openRStudioLink(String linkName, boolean includeVersionInfo) { // build url final SessionInfo sessionInfo = session_.getSessionInfo(); String url = "https://www.rstudio.org/links/" ; url += URL.encodePathSegment(linkName) ; if (includeVersionInfo) { url += "?version=" + URL.encodeQueryString(sessionInfo.getRstudioVersion()); url += "&mode=" + URL.encodeQueryString(sessionInfo.getMode()); } // open window openWindow(url); } @Override public void showHtmlFile(String path) { if (Desktop.isDesktop()) Desktop.getFrame().showFile(path); else openWindow(server_.getFileUrl(FileSystemItem.createFile(path))); } @Override public void showWordDoc(String path) { if (Desktop.isDesktop()) Desktop.getFrame().showWordDoc(path); else openWindow(server_.getFileUrl(FileSystemItem.createFile(path))); } private final Provider<ApplicationView> view_; private final Session session_; private final ApplicationServerOperations server_; private final WindowOpener windowOpener_ = GWT.create(WindowOpener.class); }