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 3a70a198af9771dc080ab3d790cab38d47196042 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 9a62c2f5b1..7ef305d552 100644
--- a/src/gwt/src/org/rstudio/core/client/ElementIds.java
+++ b/src/gwt/src/org/rstudio/core/client/ElementIds.java
@@ -295,6 +295,8 @@ public class ElementIds
public final static String PROJECT_MENUBUTTON_TOOLBAR_SUFFIX = "toolbar";
public final static String PROJECT_MENUBUTTON_MENUBAR_SUFFIX = "menubar";
+ 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 5ee1e0b025..1517834382 100644
--- a/src/gwt/src/org/rstudio/studio/client/RStudioGinjector.java
+++ b/src/gwt/src/org/rstudio/studio/client/RStudioGinjector.java
@@ -41,6 +41,7 @@ import org.rstudio.studio.client.application.AriaLiveService;
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;
@@ -226,6 +227,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 a2bb16f115..ed5f3ed4a8 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
@@ -236,6 +236,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..ca66b2f53f
--- /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 8f53957924..47c5fbb89a 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
@@ -1312,6 +1312,17 @@ well as menu structures (for main menu and popup menus).
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 803f79ecc9..1c84e2c039 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) 2021 by RStudio, PBC
+ * 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
@@ -231,6 +232,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 interruptR();
--
2.31.1
|