summaryrefslogtreecommitdiff
path: root/patches/rstudio-server-multi-version/0005-Add-version-switcher-widget-to-toolbar.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/rstudio-server-multi-version/0005-Add-version-switcher-widget-to-toolbar.patch')
-rw-r--r--patches/rstudio-server-multi-version/0005-Add-version-switcher-widget-to-toolbar.patch287
1 files changed, 287 insertions, 0 deletions
diff --git a/patches/rstudio-server-multi-version/0005-Add-version-switcher-widget-to-toolbar.patch b/patches/rstudio-server-multi-version/0005-Add-version-switcher-widget-to-toolbar.patch
new file mode 100644
index 0000000..da4f79f
--- /dev/null
+++ b/patches/rstudio-server-multi-version/0005-Add-version-switcher-widget-to-toolbar.patch
@@ -0,0 +1,287 @@
1From 3a70a198af9771dc080ab3d790cab38d47196042 Mon Sep 17 00:00:00 2001
2From: Ricardo Wurmus <rekado@elephly.net>
3Date: Sat, 19 Dec 2020 23:33:16 +0100
4Subject: [PATCH 5/7] Add version switcher widget to toolbar.
5
6---
7 .../org/rstudio/core/client/ElementIds.java | 2 +
8 .../studio/client/RStudioGinjector.java | 2 +
9 .../client/application/ui/GlobalToolbar.java | 4 +
10 .../application/ui/RVersionPopupMenu.java | 162 ++++++++++++++++++
11 .../workbench/commands/Commands.cmd.xml | 11 ++
12 .../client/workbench/commands/Commands.java | 13 ++
13 6 files changed, 194 insertions(+)
14 create mode 100644 src/gwt/src/org/rstudio/studio/client/application/ui/RVersionPopupMenu.java
15
16diff --git a/src/gwt/src/org/rstudio/core/client/ElementIds.java b/src/gwt/src/org/rstudio/core/client/ElementIds.java
17index 9a62c2f5b1..7ef305d552 100644
18--- a/src/gwt/src/org/rstudio/core/client/ElementIds.java
19+++ b/src/gwt/src/org/rstudio/core/client/ElementIds.java
20@@ -295,6 +295,8 @@ public class ElementIds
21 public final static String PROJECT_MENUBUTTON_TOOLBAR_SUFFIX = "toolbar";
22 public final static String PROJECT_MENUBUTTON_MENUBAR_SUFFIX = "menubar";
23
24+ public final static String VERSION_MENUBUTTON = "version_menubutton";
25+
26 // BuildPane
27 public final static String BUILD_MORE_MENUBUTTON = "build_more_menubutton";
28 public final static String BUILD_BOOKDOWN_MENUBUTTON = "build_bookdown_menubutton";
29diff --git a/src/gwt/src/org/rstudio/studio/client/RStudioGinjector.java b/src/gwt/src/org/rstudio/studio/client/RStudioGinjector.java
30index 5ee1e0b025..1517834382 100644
31--- a/src/gwt/src/org/rstudio/studio/client/RStudioGinjector.java
32+++ b/src/gwt/src/org/rstudio/studio/client/RStudioGinjector.java
33@@ -41,6 +41,7 @@ import org.rstudio.studio.client.application.AriaLiveService;
34 import org.rstudio.studio.client.application.events.EventBus;
35 import org.rstudio.studio.client.application.ui.AboutDialog;
36 import org.rstudio.studio.client.application.ui.ProjectPopupMenu;
37+import org.rstudio.studio.client.application.ui.RVersionPopupMenu;
38 import org.rstudio.studio.client.application.ui.addins.AddinsToolbarButton;
39 import org.rstudio.studio.client.application.ui.impl.DesktopApplicationHeader;
40 import org.rstudio.studio.client.application.ui.impl.WebApplicationHeader;
41@@ -226,6 +227,7 @@ public interface RStudioGinjector extends Ginjector
42 void injectMembers(CodeFilesList codeFilesList);
43 void injectMembers(ToolbarPopupMenu toolbarPopupMenu);
44 void injectMembers(ProjectPopupMenu projectPopupMenu);
45+ void injectMembers(RVersionPopupMenu rVersionPopupMenu);
46 void injectMembers(ClearAllDialog clearAllDialog);
47 void injectMembers(TextEditingTargetPresentationHelper presHelper);
48 void injectMembers(TextEditingTargetRMarkdownHelper rmarkdownHelper);
49diff --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
50index a2bb16f115..ed5f3ed4a8 100644
51--- a/src/gwt/src/org/rstudio/studio/client/application/ui/GlobalToolbar.java
52+++ b/src/gwt/src/org/rstudio/studio/client/application/ui/GlobalToolbar.java
53@@ -236,6 +236,10 @@ public class GlobalToolbar extends Toolbar
54 ProjectPopupMenu projectMenu = new ProjectPopupMenu(
55 sessionInfo, commands_, ElementIds.PROJECT_MENUBUTTON_TOOLBAR_SUFFIX);
56 addRightWidget(projectMenu.getToolbarButton());
57+
58+ RVersionPopupMenu rVersionMenu = new RVersionPopupMenu(
59+ sessionInfo, commands_);
60+ addRightWidget(rVersionMenu.getToolbarButton());
61 }
62 }
63
64diff --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
65new file mode 100644
66index 0000000000..ca66b2f53f
67--- /dev/null
68+++ b/src/gwt/src/org/rstudio/studio/client/application/ui/RVersionPopupMenu.java
69@@ -0,0 +1,162 @@
70+/*
71+ * RVersionPopupMenu.java
72+ *
73+ * Copyright (C) 2020 Ricardo Wurmus
74+ *
75+ * Unless you have received this program directly from RStudio pursuant
76+ * to the terms of a commercial license agreement with RStudio, then
77+ * this program is licensed to you under the terms of version 3 of the
78+ * GNU Affero General Public License. This program is distributed WITHOUT
79+ * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,
80+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the
81+ * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.
82+ *
83+ */
84+package org.rstudio.studio.client.application.ui;
85+
86+import org.rstudio.core.client.ElementIds;
87+import org.rstudio.core.client.command.AppCommand;
88+import org.rstudio.core.client.resources.ImageResource2x;
89+import org.rstudio.core.client.theme.res.ThemeResources;
90+import org.rstudio.core.client.theme.res.ThemeStyles;
91+import org.rstudio.core.client.widget.ToolbarButton;
92+import org.rstudio.core.client.widget.ToolbarMenuButton;
93+import org.rstudio.core.client.widget.ToolbarPopupMenu;
94+import org.rstudio.studio.client.RStudioGinjector;
95+import org.rstudio.studio.client.application.Desktop;
96+import org.rstudio.studio.client.application.events.SwitchToRVersionEvent;
97+import org.rstudio.studio.client.application.events.EventBus;
98+import org.rstudio.studio.client.application.model.RVersionSpec;
99+import org.rstudio.studio.client.application.model.RVersionsInfo;
100+import org.rstudio.studio.client.server.ServerError;
101+import org.rstudio.studio.client.server.ServerRequestCallback;
102+import org.rstudio.studio.client.workbench.commands.Commands;
103+import org.rstudio.studio.client.workbench.model.Session;
104+import org.rstudio.studio.client.workbench.model.SessionInfo;
105+
106+import com.google.gwt.core.client.GWT;
107+import com.google.gwt.core.client.JsArray;
108+import com.google.gwt.user.client.Event;
109+import com.google.gwt.user.client.ui.MenuItem;
110+import com.google.inject.Inject;
111+
112+public class RVersionPopupMenu extends ToolbarPopupMenu
113+{
114+ /**
115+ *
116+ * @param sessionInfo
117+ * @param commands
118+ */
119+ public RVersionPopupMenu(SessionInfo sessionInfo, Commands commands)
120+ {
121+ RStudioGinjector.INSTANCE.injectMembers(this);
122+
123+ commands_ = commands;
124+
125+ RVersionsInfo rVersionsInfo = sessionInfo.getRVersionsInfo();
126+ availableVersions_ = rVersionsInfo.getAvailableRVersions();
127+ rVersion_ = RVersionSpec.create(rVersionsInfo.getRVersion(),
128+ rVersionsInfo.getRVersionHome(),
129+ rVersionsInfo.getRVersionLabel());
130+ }
131+
132+ @Inject
133+ void initialize(EventBus events,
134+ Session session)
135+ {
136+ events_ = events;
137+ }
138+
139+ public ToolbarButton getToolbarButton()
140+ {
141+ String buttonText = "R version";
142+
143+ if (toolbarButton_ == null)
144+ {
145+ toolbarButton_ = new ToolbarMenuButton(
146+ buttonText,
147+ ToolbarButton.NoTitle,
148+ null,
149+ this,
150+ true);
151+ ElementIds.assignElementId(toolbarButton_, ElementIds.VERSION_MENUBUTTON);
152+ }
153+
154+ toolbarButton_.setTitle(buttonText);
155+ return toolbarButton_;
156+ }
157+
158+ @Override
159+ protected ToolbarMenuBar createMenuBar()
160+ {
161+ return new RVersionPopupMenuBar();
162+ }
163+
164+ private class RVersionPopupMenuBar extends ToolbarMenuBar
165+ {
166+ public RVersionPopupMenuBar()
167+ {
168+ super(true);
169+ }
170+ }
171+
172+ @Override
173+ public void getDynamicPopupMenu(final DynamicPopupMenuCallback callback)
174+ {
175+ rebuildMenu(null, callback);
176+ }
177+
178+ private void rebuildMenu(final JsArray<RVersionSpec> versions,
179+ DynamicPopupMenuCallback callback)
180+ {
181+ // clean out existing entries
182+ clearItems();
183+
184+ // ensure the menu doesn't get too narrow
185+ addSeparator(225);
186+
187+ // add as many MRU items as is appropriate for our screen size and number
188+ // of available versions
189+ AppCommand[] versionCommands = new AppCommand[] {
190+ commands_.projectVersion0(),
191+ commands_.projectVersion1(),
192+ commands_.projectVersion2(),
193+ commands_.projectVersion3(),
194+ commands_.projectVersion4(),
195+ commands_.projectVersion5(),
196+ commands_.projectVersion6(),
197+ commands_.projectVersion7(),
198+ commands_.projectVersion8(),
199+ commands_.projectVersion9()
200+ };
201+
202+ for (int i = 0; i < Math.min(versionCommands.length, MAX_VERSIONS); i++)
203+ {
204+ addItem(versionCommands[i].createMenuItem(false));
205+ }
206+
207+ for (int i = 0; i < Math.min(availableVersions_.length(),
208+ MAX_VERSIONS); i ++)
209+ {
210+ final RVersionSpec version = availableVersions_.get(i);
211+ String menuHtml = AppCommand.formatMenuLabel(
212+ null, version.getVersion() + " (" + version.getLabel() + ")", false, null);
213+ addItem(new MenuItem(menuHtml, true, () ->
214+ {
215+ events_.fireEvent(new SwitchToRVersionEvent(version));
216+ }));
217+ }
218+
219+ callback.onPopupMenu(this);
220+ }
221+
222+ private static final Resources RESOURCES = GWT.create(Resources.class);
223+
224+ private static final int MAX_VERSIONS = 10;
225+ private JsArray<RVersionSpec> availableVersions_;
226+ private final RVersionSpec rVersion_;
227+ private ToolbarMenuButton toolbarButton_ = null;
228+
229+ private final Commands commands_;
230+ private EventBus events_;
231+}
232diff --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
233index 8f53957924..47c5fbb89a 100644
234--- a/src/gwt/src/org/rstudio/studio/client/workbench/commands/Commands.cmd.xml
235+++ b/src/gwt/src/org/rstudio/studio/client/workbench/commands/Commands.cmd.xml
236@@ -1312,6 +1312,17 @@ well as menu structures (for main menu and popup menus).
237 desc="Edit options for the current project"
238 windowMode="main"/>
239
240+ <cmd id="projectVersion0" visible="false" rebindable="false" windowMode="main"/>
241+ <cmd id="projectVersion1" visible="false" rebindable="false" windowMode="main"/>
242+ <cmd id="projectVersion2" visible="false" rebindable="false" windowMode="main"/>
243+ <cmd id="projectVersion3" visible="false" rebindable="false" windowMode="main"/>
244+ <cmd id="projectVersion4" visible="false" rebindable="false" windowMode="main"/>
245+ <cmd id="projectVersion5" visible="false" rebindable="false" windowMode="main"/>
246+ <cmd id="projectVersion6" visible="false" rebindable="false" windowMode="main"/>
247+ <cmd id="projectVersion7" visible="false" rebindable="false" windowMode="main"/>
248+ <cmd id="projectVersion8" visible="false" rebindable="false" windowMode="main"/>
249+ <cmd id="projectVersion9" visible="false" rebindable="false" windowMode="main"/>
250+
251 <cmd id="projectSweaveOptions"
252 menuLabel=""
253 buttonLabel=""
254diff --git a/src/gwt/src/org/rstudio/studio/client/workbench/commands/Commands.java b/src/gwt/src/org/rstudio/studio/client/workbench/commands/Commands.java
255index 803f79ecc9..1c84e2c039 100644
256--- a/src/gwt/src/org/rstudio/studio/client/workbench/commands/Commands.java
257+++ b/src/gwt/src/org/rstudio/studio/client/workbench/commands/Commands.java
258@@ -2,6 +2,7 @@
259 * Commands.java
260 *
261 * Copyright (C) 2021 by RStudio, PBC
262+ * Copyright (C) 2020 Ricardo Wurmus
263 *
264 * Unless you have received this program directly from RStudio pursuant
265 * to the terms of a commercial license agreement with RStudio, then
266@@ -231,6 +232,18 @@ public abstract class
267 public abstract AppCommand projectSweaveOptions();
268 public abstract AppCommand setWorkingDirToProjectDir();
269
270+ // R Versions
271+ public abstract AppCommand projectVersion0();
272+ public abstract AppCommand projectVersion1();
273+ public abstract AppCommand projectVersion2();
274+ public abstract AppCommand projectVersion3();
275+ public abstract AppCommand projectVersion4();
276+ public abstract AppCommand projectVersion5();
277+ public abstract AppCommand projectVersion6();
278+ public abstract AppCommand projectVersion7();
279+ public abstract AppCommand projectVersion8();
280+ public abstract AppCommand projectVersion9();
281+
282 // Console
283 public abstract AppCommand consoleClear();
284 public abstract AppCommand interruptR();
285--
2862.31.1
287