/* * RStudio.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; import com.google.gwt.core.client.EntryPoint; import com.google.gwt.core.client.GWT; import com.google.gwt.core.client.RunAsyncCallback; import com.google.gwt.dom.client.Element; import com.google.gwt.dom.client.Style; import com.google.gwt.dom.client.StyleInjector; import com.google.gwt.user.client.Command; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.RootLayoutPanel; import com.google.gwt.user.client.ui.SimplePanel; import org.rstudio.core.client.BrowseCap; import org.rstudio.core.client.Debug; import org.rstudio.core.client.ElementIds; import org.rstudio.core.client.cellview.LinkColumn; import org.rstudio.core.client.files.filedialog.FileDialogResources; import org.rstudio.core.client.prefs.PreferencesDialogBaseResources; import org.rstudio.core.client.resources.CoreResources; import org.rstudio.core.client.theme.res.ThemeResources; import org.rstudio.core.client.widget.CaptionWithHelp; import org.rstudio.core.client.widget.FontSizer; import org.rstudio.core.client.widget.LocalRepositoriesWidget; import org.rstudio.core.client.widget.ProgressDialog; import org.rstudio.core.client.widget.ResizeGripper; import org.rstudio.core.client.widget.SlideLabel; import org.rstudio.core.client.widget.ThemedButton; import org.rstudio.core.client.widget.ThemedPopupPanel; import org.rstudio.core.client.widget.WizardResources; import org.rstudio.core.client.widget.images.ProgressImages; import org.rstudio.studio.client.application.ui.AboutDialogContents; import org.rstudio.studio.client.application.ui.appended.ApplicationEndedPopupPanel; import org.rstudio.studio.client.application.ui.serializationprogress.ApplicationSerializationProgress; import org.rstudio.studio.client.application.ui.support.SupportPopupMenu; import org.rstudio.studio.client.common.StudioResources; import org.rstudio.studio.client.common.mirrors.ChooseMirrorDialog; import org.rstudio.studio.client.common.rpubs.ui.RPubsUploadDialog; import org.rstudio.studio.client.common.sourcemarkers.SourceMarkerListResources; import org.rstudio.studio.client.common.spelling.ui.SpellingCustomDictionariesWidget; import org.rstudio.studio.client.common.vcs.CreateKeyDialog; import org.rstudio.studio.client.common.vcs.ShowPublicKeyDialog; import org.rstudio.studio.client.common.vcs.SshKeyWidget; import org.rstudio.studio.client.common.vcs.ignore.IgnoreDialog; import org.rstudio.studio.client.htmlpreview.HTMLPreviewApplication; import org.rstudio.studio.client.notebookv2.CompileNotebookv2OptionsDialog; import org.rstudio.studio.client.packrat.ui.PackratActionDialog; import org.rstudio.studio.client.packrat.ui.PackratResolveConflictDialog; import org.rstudio.studio.client.projects.ui.newproject.NewProjectResources; import org.rstudio.studio.client.projects.ui.prefs.ProjectPreferencesDialogResources; import org.rstudio.studio.client.rmarkdown.RmdOutputSatellite; import org.rstudio.studio.client.rsconnect.ui.RSConnectDeploy; import org.rstudio.studio.client.shiny.ShinyApplicationSatellite; import org.rstudio.studio.client.vcs.VCSApplication; import org.rstudio.studio.client.workbench.codesearch.ui.CodeSearchResources; import org.rstudio.studio.client.workbench.exportplot.ExportPlotResources; import org.rstudio.studio.client.workbench.prefs.views.PreferencesDialog; import org.rstudio.studio.client.workbench.ui.unsaved.UnsavedChangesDialog; import org.rstudio.studio.client.workbench.views.buildtools.ui.BuildPaneResources; import org.rstudio.studio.client.workbench.views.connections.ui.NewConnectionShinyHost; import org.rstudio.studio.client.workbench.views.connections.ui.NewConnectionSnippetDialog; import org.rstudio.studio.client.workbench.views.connections.ui.NewConnectionSnippetHost; import org.rstudio.studio.client.workbench.views.connections.ui.NewConnectionWizard; import org.rstudio.studio.client.workbench.views.console.ConsoleResources; import org.rstudio.studio.client.workbench.views.files.ui.FilesListDataGridResources; import org.rstudio.studio.client.workbench.views.history.view.HistoryPane; import org.rstudio.studio.client.workbench.views.history.view.Shelf; import org.rstudio.studio.client.workbench.views.packages.ui.CheckForUpdatesDialog; import org.rstudio.studio.client.workbench.views.packages.ui.InstallPackageDialog; import org.rstudio.studio.client.workbench.views.packages.ui.PackagesCellTableResources; import org.rstudio.studio.client.workbench.views.packages.ui.actions.ActionCenter; import org.rstudio.studio.client.workbench.views.plots.ui.manipulator.ManipulatorResources; import org.rstudio.studio.client.workbench.views.source.SourceSatellite; import org.rstudio.studio.client.workbench.views.source.editors.codebrowser.CodeBrowserEditingTargetWidget; import org.rstudio.studio.client.workbench.views.source.editors.text.AceEditor; import org.rstudio.studio.client.workbench.views.source.editors.text.ChunkSatellite; import org.rstudio.studio.client.workbench.views.source.editors.text.cpp.CppCompletionResources; import org.rstudio.studio.client.workbench.views.source.editors.text.findreplace.FindReplaceBar; import org.rstudio.studio.client.workbench.views.terminal.xterm.XTermWidget; import org.rstudio.studio.client.workbench.views.vcs.common.ChangelistTable; import org.rstudio.studio.client.workbench.views.vcs.common.diff.LineTableView; import org.rstudio.studio.client.workbench.views.vcs.dialog.DiffFrame; import org.rstudio.studio.client.workbench.views.environment.dataimport.ImportFileSettingsDialog; public class RStudio implements EntryPoint { public void onModuleLoad() { Debug.injectDebug(); Command dismissProgressAnimation = showProgress(); delayLoadApplication(dismissProgressAnimation); } private Command showProgress() { final Label background = new Label(); background.getElement().getStyle().setZIndex(1000); background.getElement().getStyle().setBackgroundColor("#e1e2e5"); final RootLayoutPanel rootPanel = RootLayoutPanel.get(); rootPanel.add(background); rootPanel.setWidgetTopBottom(background, 0, Style.Unit.PX, 0, Style.Unit.PX); rootPanel.setWidgetLeftRight(background, 0, Style.Unit.PX, 0, Style.Unit.PX); String progressUrl = ProgressImages.createLargeGray().getUrl(); StringBuilder str = new StringBuilder(); str.append("<img src=\""); str.append(progressUrl); str.append("\""); if (BrowseCap.devicePixelRatio() > 1.0) str.append("width=24 height=24"); str.append("/>"); final SimplePanel progressPanel = new SimplePanel(); final Element div = progressPanel.getElement(); div.setInnerHTML(str.toString()); div.getStyle().setWidth(100, Style.Unit.PCT); div.getStyle().setMarginTop(200, Style.Unit.PX); div.getStyle().setProperty("textAlign", "center"); div.getStyle().setZIndex(1000); ElementIds.assignElementId(div, ElementIds.LOADING_SPINNER); rootPanel.add(progressPanel); return new Command() { public void execute() { try { rootPanel.remove(progressPanel); rootPanel.remove(background); } catch (Exception e) { Debug.log(e.toString()); } } }; } private void delayLoadApplication(final Command dismissProgressAnimation) { final RunAsyncCallback runCallback = new RunAsyncCallback() { public void onFailure(Throwable reason) { dismissProgressAnimation.execute(); Window.alert("Error: " + reason.getMessage()); } public void onSuccess() { // TODO (gary) This early loading of XTermWidget dependencies needs to be // removed once I figure out why XTermWidget.load in // TerminalPane:createMainWidget) isn't sufficient. Suspect due to xterm.js // loading its add-ons (fit.js) but need to investigate. XTermWidget.load(new Command() { public void execute() { AceEditor.load(new Command() { public void execute() { ensureStylesInjected(); String view = Window.Location.getParameter("view"); if (VCSApplication.NAME.equals(view)) { RStudioGinjector.INSTANCE.getVCSApplication().go( RootLayoutPanel.get(), dismissProgressAnimation); } else if (HTMLPreviewApplication.NAME.equals(view)) { RStudioGinjector.INSTANCE.getHTMLPreviewApplication().go( RootLayoutPanel.get(), dismissProgressAnimation); } else if (ShinyApplicationSatellite.NAME.equals(view)) { RStudioGinjector.INSTANCE.getShinyApplicationSatellite().go( RootLayoutPanel.get(), dismissProgressAnimation); } else if (RmdOutputSatellite.NAME.equals(view)) { RStudioGinjector.INSTANCE.getRmdOutputSatellite().go( RootLayoutPanel.get(), dismissProgressAnimation); } else if (view != null && view.startsWith(SourceSatellite.NAME_PREFIX)) { SourceSatellite satellite = new SourceSatellite(view); satellite.go(RootLayoutPanel.get(), dismissProgressAnimation); } else if (view != null && view.startsWith(ChunkSatellite.NAME_PREFIX)) { ChunkSatellite satellite = new ChunkSatellite(view); satellite.go(RootLayoutPanel.get(), dismissProgressAnimation); } else { RStudioGinjector.INSTANCE.getApplication().go( RootLayoutPanel.get(), dismissProgressAnimation); } } }); } }); } }; GWT.runAsync(runCallback); } private void ensureStylesInjected() { ThemeResources.INSTANCE.themeStyles().ensureInjected(); CoreResources.INSTANCE.styles().ensureInjected(); StudioResources.INSTANCE.styles().ensureInjected(); ConsoleResources.INSTANCE.consoleStyles().ensureInjected(); FileDialogResources.INSTANCE.styles().ensureInjected(); ManipulatorResources.INSTANCE.manipulatorStyles().ensureInjected(); PackagesCellTableResources.INSTANCE.cellTableStyle().ensureInjected(); FilesListDataGridResources.INSTANCE.dataGridStyle().ensureInjected(); ExportPlotResources.INSTANCE.styles().ensureInjected(); CodeSearchResources.INSTANCE.styles().ensureInjected(); SourceMarkerListResources.INSTANCE.styles().ensureInjected(); BuildPaneResources.INSTANCE.styles().ensureInjected(); ProgressDialog.ensureStylesInjected(); SupportPopupMenu.ensureStylesInjected(); SlideLabel.ensureStylesInjected(); ThemedButton.ensureStylesInjected(); ThemedPopupPanel.ensureStylesInjected(); InstallPackageDialog.ensureStylesInjected(); ApplicationEndedPopupPanel.ensureStylesInjected(); ApplicationSerializationProgress.ensureStylesInjected(); HistoryPane.ensureStylesInjected(); Shelf.ensureStylesInjected(); ImportFileSettingsDialog.ensureStylesInjected(); FindReplaceBar.ensureStylesInjected(); FontSizer.ensureStylesInjected(); PreferencesDialogBaseResources.INSTANCE.styles().ensureInjected(); PreferencesDialog.ensureStylesInjected(); ProjectPreferencesDialogResources.INSTANCE.styles().ensureInjected(); LinkColumn.ensureStylesInjected(); CaptionWithHelp.ensureStylesInjected(); CheckForUpdatesDialog.ensureStylesInjected(); UnsavedChangesDialog.ensureStylesInjected(); ChooseMirrorDialog.ensureStylesInjected(); ResizeGripper.ensureStylesInjected(); LineTableView.ensureStylesInjected(); ChangelistTable.ensureStylesInjected(); DiffFrame.ensureStylesInjected(); CodeBrowserEditingTargetWidget.ensureStylesInjected(); ShowPublicKeyDialog.ensureStylesInjected(); CreateKeyDialog.ensureStylesInjected(); SshKeyWidget.ensureStylesInjected(); IgnoreDialog.ensureStylesInjected(); SpellingCustomDictionariesWidget.ensureStylesInjected(); RPubsUploadDialog.ensureStylesInjected(); WizardResources.INSTANCE.styles().ensureInjected(); NewProjectResources.INSTANCE.styles().ensureInjected(); AboutDialogContents.ensureStylesInjected(); CompileNotebookv2OptionsDialog.ensureStylesInjected(); ActionCenter.ensureStylesInjected(); PackratResolveConflictDialog.ensureStylesInjected(); PackratActionDialog.ensureStylesInjected(); LocalRepositoriesWidget.ensureStylesInjected(); CppCompletionResources.INSTANCE.styles().ensureInjected(); RSConnectDeploy.RESOURCES.style().ensureInjected(); NewConnectionShinyHost.ensureStylesInjected(); NewConnectionSnippetHost.ensureStylesInjected(); NewConnectionSnippetDialog.ensureStylesInjected(); NewConnectionWizard.ensureStylesInjected(); StyleInjector.inject( "button::-moz-focus-inner {border:0}"); } }