UNPKG

9.96 kBJavaScriptView Raw
1// Copyright (c) Jupyter Development Team.
2// Distributed under the terms of the Modified BSD License.
3import { IRankedMenu, MenuSvg, RankedMenu } from '@jupyterlab/ui-components';
4import { ArrayExt } from '@lumino/algorithm';
5import { MenuBar } from '@lumino/widgets';
6import { EditMenu } from './edit';
7import { FileMenu } from './file';
8import { HelpMenu } from './help';
9import { KernelMenu } from './kernel';
10import { RunMenu } from './run';
11import { SettingsMenu } from './settings';
12import { TabsMenu } from './tabs';
13import { ViewMenu } from './view';
14/**
15 * The main menu class. It is intended to be used as a singleton.
16 */
17export class MainMenu extends MenuBar {
18 /**
19 * Construct the main menu bar.
20 */
21 constructor(commands) {
22 super();
23 this._items = [];
24 this._commands = commands;
25 }
26 /**
27 * The application "Edit" menu.
28 */
29 get editMenu() {
30 if (!this._editMenu) {
31 this._editMenu = new EditMenu({
32 commands: this._commands,
33 rank: 2,
34 renderer: MenuSvg.defaultRenderer
35 });
36 }
37 return this._editMenu;
38 }
39 /**
40 * The application "File" menu.
41 */
42 get fileMenu() {
43 if (!this._fileMenu) {
44 this._fileMenu = new FileMenu({
45 commands: this._commands,
46 rank: 1,
47 renderer: MenuSvg.defaultRenderer
48 });
49 }
50 return this._fileMenu;
51 }
52 /**
53 * The application "Help" menu.
54 */
55 get helpMenu() {
56 if (!this._helpMenu) {
57 this._helpMenu = new HelpMenu({
58 commands: this._commands,
59 rank: 1000,
60 renderer: MenuSvg.defaultRenderer
61 });
62 }
63 return this._helpMenu;
64 }
65 /**
66 * The application "Kernel" menu.
67 */
68 get kernelMenu() {
69 if (!this._kernelMenu) {
70 this._kernelMenu = new KernelMenu({
71 commands: this._commands,
72 rank: 5,
73 renderer: MenuSvg.defaultRenderer
74 });
75 }
76 return this._kernelMenu;
77 }
78 /**
79 * The application "Run" menu.
80 */
81 get runMenu() {
82 if (!this._runMenu) {
83 this._runMenu = new RunMenu({
84 commands: this._commands,
85 rank: 4,
86 renderer: MenuSvg.defaultRenderer
87 });
88 }
89 return this._runMenu;
90 }
91 /**
92 * The application "Settings" menu.
93 */
94 get settingsMenu() {
95 if (!this._settingsMenu) {
96 this._settingsMenu = new SettingsMenu({
97 commands: this._commands,
98 rank: 999,
99 renderer: MenuSvg.defaultRenderer
100 });
101 }
102 return this._settingsMenu;
103 }
104 /**
105 * The application "View" menu.
106 */
107 get viewMenu() {
108 if (!this._viewMenu) {
109 this._viewMenu = new ViewMenu({
110 commands: this._commands,
111 rank: 3,
112 renderer: MenuSvg.defaultRenderer
113 });
114 }
115 return this._viewMenu;
116 }
117 /**
118 * The application "Tabs" menu.
119 */
120 get tabsMenu() {
121 if (!this._tabsMenu) {
122 this._tabsMenu = new TabsMenu({
123 commands: this._commands,
124 rank: 500,
125 renderer: MenuSvg.defaultRenderer
126 });
127 }
128 return this._tabsMenu;
129 }
130 /**
131 * Add a new menu to the main menu bar.
132 */
133 addMenu(menu, options = {}) {
134 if (ArrayExt.firstIndexOf(this.menus, menu) > -1) {
135 return;
136 }
137 // override default renderer with svg-supporting renderer
138 MenuSvg.overrideDefaultRenderer(menu);
139 const rank = 'rank' in options
140 ? options.rank
141 : 'rank' in menu
142 ? menu.rank
143 : IRankedMenu.DEFAULT_RANK;
144 const rankItem = { menu, rank };
145 const index = ArrayExt.upperBound(this._items, rankItem, Private.itemCmp);
146 // Upon disposal, remove the menu and its rank reference.
147 menu.disposed.connect(this._onMenuDisposed, this);
148 ArrayExt.insert(this._items, index, rankItem);
149 /**
150 * Create a new menu.
151 */
152 this.insertMenu(index, menu);
153 // Link the menu to the API - backward compatibility when switching to menu description in settings
154 switch (menu.id) {
155 case 'jp-mainmenu-file':
156 if (!this._fileMenu && menu instanceof FileMenu) {
157 this._fileMenu = menu;
158 }
159 break;
160 case 'jp-mainmenu-edit':
161 if (!this._editMenu && menu instanceof EditMenu) {
162 this._editMenu = menu;
163 }
164 break;
165 case 'jp-mainmenu-view':
166 if (!this._viewMenu && menu instanceof ViewMenu) {
167 this._viewMenu = menu;
168 }
169 break;
170 case 'jp-mainmenu-run':
171 if (!this._runMenu && menu instanceof RunMenu) {
172 this._runMenu = menu;
173 }
174 break;
175 case 'jp-mainmenu-kernel':
176 if (!this._kernelMenu && menu instanceof KernelMenu) {
177 this._kernelMenu = menu;
178 }
179 break;
180 case 'jp-mainmenu-tabs':
181 if (!this._tabsMenu && menu instanceof TabsMenu) {
182 this._tabsMenu = menu;
183 }
184 break;
185 case 'jp-mainmenu-settings':
186 if (!this._settingsMenu && menu instanceof SettingsMenu) {
187 this._settingsMenu = menu;
188 }
189 break;
190 case 'jp-mainmenu-help':
191 if (!this._helpMenu && menu instanceof HelpMenu) {
192 this._helpMenu = menu;
193 }
194 break;
195 }
196 }
197 /**
198 * Dispose of the resources held by the menu bar.
199 */
200 dispose() {
201 var _a, _b, _c, _d, _e, _f, _g, _h;
202 (_a = this._editMenu) === null || _a === void 0 ? void 0 : _a.dispose();
203 (_b = this._fileMenu) === null || _b === void 0 ? void 0 : _b.dispose();
204 (_c = this._helpMenu) === null || _c === void 0 ? void 0 : _c.dispose();
205 (_d = this._kernelMenu) === null || _d === void 0 ? void 0 : _d.dispose();
206 (_e = this._runMenu) === null || _e === void 0 ? void 0 : _e.dispose();
207 (_f = this._settingsMenu) === null || _f === void 0 ? void 0 : _f.dispose();
208 (_g = this._viewMenu) === null || _g === void 0 ? void 0 : _g.dispose();
209 (_h = this._tabsMenu) === null || _h === void 0 ? void 0 : _h.dispose();
210 super.dispose();
211 }
212 /**
213 * Generate the menu.
214 *
215 * @param commands The command registry
216 * @param options The main menu options.
217 * @param trans - The application language translator.
218 */
219 static generateMenu(commands, options, trans) {
220 let menu;
221 const { id, label, rank } = options;
222 switch (id) {
223 case 'jp-mainmenu-file':
224 menu = new FileMenu({
225 commands,
226 rank,
227 renderer: MenuSvg.defaultRenderer
228 });
229 break;
230 case 'jp-mainmenu-edit':
231 menu = new EditMenu({
232 commands,
233 rank,
234 renderer: MenuSvg.defaultRenderer
235 });
236 break;
237 case 'jp-mainmenu-view':
238 menu = new ViewMenu({
239 commands,
240 rank,
241 renderer: MenuSvg.defaultRenderer
242 });
243 break;
244 case 'jp-mainmenu-run':
245 menu = new RunMenu({
246 commands,
247 rank,
248 renderer: MenuSvg.defaultRenderer
249 });
250 break;
251 case 'jp-mainmenu-kernel':
252 menu = new KernelMenu({
253 commands,
254 rank,
255 renderer: MenuSvg.defaultRenderer
256 });
257 break;
258 case 'jp-mainmenu-tabs':
259 menu = new TabsMenu({
260 commands,
261 rank,
262 renderer: MenuSvg.defaultRenderer
263 });
264 break;
265 case 'jp-mainmenu-settings':
266 menu = new SettingsMenu({
267 commands,
268 rank,
269 renderer: MenuSvg.defaultRenderer
270 });
271 break;
272 case 'jp-mainmenu-help':
273 menu = new HelpMenu({
274 commands,
275 rank,
276 renderer: MenuSvg.defaultRenderer
277 });
278 break;
279 default:
280 menu = new RankedMenu({
281 commands,
282 rank,
283 renderer: MenuSvg.defaultRenderer
284 });
285 }
286 if (label) {
287 menu.title.label = trans._p('menu', label);
288 }
289 return menu;
290 }
291 /**
292 * Handle the disposal of a menu.
293 */
294 _onMenuDisposed(menu) {
295 this.removeMenu(menu);
296 const index = ArrayExt.findFirstIndex(this._items, item => item.menu === menu);
297 if (index !== -1) {
298 ArrayExt.removeAt(this._items, index);
299 }
300 }
301}
302/**
303 * A namespace for private data.
304 */
305var Private;
306(function (Private) {
307 /**
308 * A comparator function for menu rank items.
309 */
310 function itemCmp(first, second) {
311 return first.rank - second.rank;
312 }
313 Private.itemCmp = itemCmp;
314})(Private || (Private = {}));
315//# sourceMappingURL=mainmenu.js.map
\No newline at end of file