From fdca633e307d4915fc99ba44c9bbc823b64c75a2 Mon Sep 17 00:00:00 2001 From: Ricardo Wurmus Date: Sat, 19 Dec 2020 23:33:16 +0100 Subject: [PATCH 5/7] Add version switcher widget to toolbar. --- .../org/rstudio/core/client/ElementIds.java | 2 + .../studio/client/RStudioGinjector.java | 2 + .../client/application/ui/GlobalToolbar.java | 4 + .../application/ui/RVersionPopupMenu.java | 162 ++++++++++++++++++ .../workbench/commands/Commands.cmd.xml | 11 ++ .../client/workbench/commands/Commands.java | 13 ++ 6 files changed, 194 insertions(+) create mode 100644 src/gwt/src/org/rstudio/studio/client/application/ui/RVersionPopupMenu.java diff --git a/src/gwt/src/org/rstudio/core/client/ElementIds.java b/src/gwt/src/org/rstudio/core/client/ElementIds.java index 531dfb43d8..36297de2a8 100644 --- a/src/gwt/src/org/rstudio/core/client/ElementIds.java +++ b/src/gwt/src/org/rstudio/core/client/ElementIds.java @@ -394,6 +394,8 @@ public class ElementIds public final static String SIDEBAR_TOGGLE_BUTTON = "sidebar_toggle_button"; public final static String ASSISTANT_TOGGLE_BUTTON = "assistant_toggle_button"; + public final static String VERSION_MENUBUTTON = "version_menubutton"; + // BuildPane public final static String BUILD_MORE_MENUBUTTON = "build_more_menubutton"; public final static String BUILD_BOOKDOWN_MENUBUTTON = "build_bookdown_menubutton"; diff --git a/src/gwt/src/org/rstudio/studio/client/RStudioGinjector.java b/src/gwt/src/org/rstudio/studio/client/RStudioGinjector.java index 91a398836b..5a082a0f03 100644 --- a/src/gwt/src/org/rstudio/studio/client/RStudioGinjector.java +++ b/src/gwt/src/org/rstudio/studio/client/RStudioGinjector.java @@ -39,6 +39,7 @@ import org.rstudio.studio.client.application.LoggedOutDialog; import org.rstudio.studio.client.application.events.EventBus; import org.rstudio.studio.client.application.ui.AboutDialog; import org.rstudio.studio.client.application.ui.ProjectPopupMenu; +import org.rstudio.studio.client.application.ui.RVersionPopupMenu; import org.rstudio.studio.client.application.ui.addins.AddinsToolbarButton; import org.rstudio.studio.client.application.ui.impl.DesktopApplicationHeader; import org.rstudio.studio.client.application.ui.impl.WebApplicationHeader; @@ -242,6 +243,7 @@ public interface RStudioGinjector extends Ginjector void injectMembers(CodeFilesList codeFilesList); void injectMembers(ToolbarPopupMenu toolbarPopupMenu); void injectMembers(ProjectPopupMenu projectPopupMenu); + void injectMembers(RVersionPopupMenu rVersionPopupMenu); void injectMembers(ClearAllDialog clearAllDialog); void injectMembers(TextEditingTargetPresentationHelper presHelper); void injectMembers(TextEditingTargetRMarkdownHelper rmarkdownHelper); diff --git a/src/gwt/src/org/rstudio/studio/client/application/ui/GlobalToolbar.java b/src/gwt/src/org/rstudio/studio/client/application/ui/GlobalToolbar.java index 82e2de1941..94332f29db 100644 --- a/src/gwt/src/org/rstudio/studio/client/application/ui/GlobalToolbar.java +++ b/src/gwt/src/org/rstudio/studio/client/application/ui/GlobalToolbar.java @@ -349,6 +349,10 @@ public class GlobalToolbar extends Toolbar ProjectPopupMenu projectMenu = new ProjectPopupMenu( sessionInfo, commands_, ElementIds.PROJECT_MENUBUTTON_TOOLBAR_SUFFIX); addRightWidget(projectMenu.getToolbarButton()); + + RVersionPopupMenu rVersionMenu = new RVersionPopupMenu( + sessionInfo, commands_); + addRightWidget(rVersionMenu.getToolbarButton()); } } diff --git a/src/gwt/src/org/rstudio/studio/client/application/ui/RVersionPopupMenu.java b/src/gwt/src/org/rstudio/studio/client/application/ui/RVersionPopupMenu.java new file mode 100644 index 0000000000..eedc5996ae --- /dev/null +++ b/src/gwt/src/org/rstudio/studio/client/application/ui/RVersionPopupMenu.java @@ -0,0 +1,162 @@ +/* + * RVersionPopupMenu.java + * + * Copyright (C) 2020 Ricardo Wurmus + * + * 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.application.ui; + +import org.rstudio.core.client.ElementIds; +import org.rstudio.core.client.command.AppCommand; +import org.rstudio.core.client.resources.ImageResource2x; +import org.rstudio.core.client.theme.res.ThemeResources; +import org.rstudio.core.client.theme.res.ThemeStyles; +import org.rstudio.core.client.widget.ToolbarButton; +import org.rstudio.core.client.widget.ToolbarMenuButton; +import org.rstudio.core.client.widget.ToolbarPopupMenu; +import org.rstudio.studio.client.RStudioGinjector; +import org.rstudio.studio.client.application.Desktop; +import org.rstudio.studio.client.application.events.SwitchToRVersionEvent; +import org.rstudio.studio.client.application.events.EventBus; +import org.rstudio.studio.client.application.model.RVersionSpec; +import org.rstudio.studio.client.application.model.RVersionsInfo; +import org.rstudio.studio.client.server.ServerError; +import org.rstudio.studio.client.server.ServerRequestCallback; +import org.rstudio.studio.client.workbench.commands.Commands; +import org.rstudio.studio.client.workbench.model.Session; +import org.rstudio.studio.client.workbench.model.SessionInfo; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.core.client.JsArray; +import com.google.gwt.user.client.Event; +import com.google.gwt.user.client.ui.MenuItem; +import com.google.inject.Inject; + +public class RVersionPopupMenu extends ToolbarPopupMenu +{ + /** + * + * @param sessionInfo + * @param commands + */ + public RVersionPopupMenu(SessionInfo sessionInfo, Commands commands) + { + RStudioGinjector.INSTANCE.injectMembers(this); + + commands_ = commands; + + RVersionsInfo rVersionsInfo = sessionInfo.getRVersionsInfo(); + availableVersions_ = rVersionsInfo.getAvailableRVersions(); + rVersion_ = RVersionSpec.create(rVersionsInfo.getRVersion(), + rVersionsInfo.getRVersionHome(), + rVersionsInfo.getRVersionLabel()); + } + + @Inject + void initialize(EventBus events, + Session session) + { + events_ = events; + } + + public ToolbarButton getToolbarButton() + { + String buttonText = "R version"; + + if (toolbarButton_ == null) + { + toolbarButton_ = new ToolbarMenuButton( + buttonText, + ToolbarButton.NoTitle, + null, + this, + true); + ElementIds.assignElementId(toolbarButton_, ElementIds.VERSION_MENUBUTTON); + } + + toolbarButton_.setTitle(buttonText); + return toolbarButton_; + } + + @Override + protected ToolbarMenuBar createMenuBar() + { + return new RVersionPopupMenuBar(); + } + + private class RVersionPopupMenuBar extends ToolbarMenuBar + { + public RVersionPopupMenuBar() + { + super(true); + } + } + + @Override + public void getDynamicPopupMenu(final DynamicPopupMenuCallback callback) + { + rebuildMenu(null, callback); + } + + private void rebuildMenu(final JsArray versions, + DynamicPopupMenuCallback callback) + { + // clean out existing entries + clearItems(); + + // ensure the menu doesn't get too narrow + addSeparator(225); + + // add as many MRU items as is appropriate for our screen size and number + // of available versions + AppCommand[] versionCommands = new AppCommand[] { + commands_.projectVersion0(), + commands_.projectVersion1(), + commands_.projectVersion2(), + commands_.projectVersion3(), + commands_.projectVersion4(), + commands_.projectVersion5(), + commands_.projectVersion6(), + commands_.projectVersion7(), + commands_.projectVersion8(), + commands_.projectVersion9() + }; + + for (int i = 0; i < Math.min(versionCommands.length, MAX_VERSIONS); i++) + { + addItem(versionCommands[i].createMenuItem(false)); + } + + for (int i = 0; i < Math.min(availableVersions_.length(), + MAX_VERSIONS); i ++) + { + final RVersionSpec version = availableVersions_.get(i); + String menuHtml = AppCommand.formatMenuLabel( + null, version.getVersion() + " (" + version.getLabel() + ")", false, null); + addItem(new MenuItem(menuHtml, true, () -> + { + events_.fireEvent(new SwitchToRVersionEvent(version)); + })); + } + + callback.onPopupMenu(this); + } + + private static final Resources RESOURCES = GWT.create(Resources.class); + + private static final int MAX_VERSIONS = 10; + private JsArray availableVersions_; + private final RVersionSpec rVersion_; + private ToolbarMenuButton toolbarButton_ = null; + + private final Commands commands_; + private EventBus events_; +} diff --git a/src/gwt/src/org/rstudio/studio/client/workbench/commands/Commands.cmd.xml b/src/gwt/src/org/rstudio/studio/client/workbench/commands/Commands.cmd.xml index 20322193cd..361864d129 100644 --- a/src/gwt/src/org/rstudio/studio/client/workbench/commands/Commands.cmd.xml +++ b/src/gwt/src/org/rstudio/studio/client/workbench/commands/Commands.cmd.xml @@ -1387,6 +1387,17 @@ See `/src/gwt/tools/i18n-helpers/README.md`. desc="Edit options for the current project" windowMode="main"/> + + + + + + + + + + +