summaryrefslogtreecommitdiff
path: root/patches/rstudio-server-multi-version/0005-Add-version-switcher-widget-to-toolbar.patch
blob: dfb840084a1bd718986ad908eef79f82253339d9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
From fdca633e307d4915fc99ba44c9bbc823b64c75a2 Mon Sep 17 00:00:00 2001
From: Ricardo Wurmus <rekado@elephly.net>
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<RVersionSpec> 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<RVersionSpec> 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"/>
 
+   <cmd id="projectVersion0" visible="false" rebindable="false" windowMode="main"/>
+   <cmd id="projectVersion1" visible="false" rebindable="false" windowMode="main"/>
+   <cmd id="projectVersion2" visible="false" rebindable="false" windowMode="main"/>
+   <cmd id="projectVersion3" visible="false" rebindable="false" windowMode="main"/>
+   <cmd id="projectVersion4" visible="false" rebindable="false" windowMode="main"/>
+   <cmd id="projectVersion5" visible="false" rebindable="false" windowMode="main"/>
+   <cmd id="projectVersion6" visible="false" rebindable="false" windowMode="main"/>
+   <cmd id="projectVersion7" visible="false" rebindable="false" windowMode="main"/>
+   <cmd id="projectVersion8" visible="false" rebindable="false" windowMode="main"/>
+   <cmd id="projectVersion9" visible="false" rebindable="false" windowMode="main"/>
+
    <cmd id="projectSweaveOptions"
         menuLabel=""
         buttonLabel=""
diff --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
index adc2c49d0e..627a0292ab 100644
--- a/src/gwt/src/org/rstudio/studio/client/workbench/commands/Commands.java
+++ b/src/gwt/src/org/rstudio/studio/client/workbench/commands/Commands.java
@@ -2,6 +2,7 @@
  * Commands.java
  *
  * Copyright (C) 2022 by Posit Software, PBC
+ * Copyright (C) 2020-2025 Ricardo Wurmus
  *
  * Unless you have received this program directly from Posit Software pursuant
  * to the terms of a commercial license agreement with Posit Software, then
@@ -242,6 +243,18 @@ public abstract class
    public abstract AppCommand projectSweaveOptions();
    public abstract AppCommand setWorkingDirToProjectDir();
 
+   // R Versions
+   public abstract AppCommand projectVersion0();
+   public abstract AppCommand projectVersion1();
+   public abstract AppCommand projectVersion2();
+   public abstract AppCommand projectVersion3();
+   public abstract AppCommand projectVersion4();
+   public abstract AppCommand projectVersion5();
+   public abstract AppCommand projectVersion6();
+   public abstract AppCommand projectVersion7();
+   public abstract AppCommand projectVersion8();
+   public abstract AppCommand projectVersion9();
+
    // Console
    public abstract AppCommand consoleClear();
    public abstract AppCommand consoleFind();
-- 
2.54.0