123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369 |
- // Copyright (c) Jupyter Development Team.
- // Distributed under the terms of the Modified BSD License.
- import { TranslationBundle } from '@jupyterlab/translation';
- import { IRankedMenu, MenuSvg, RankedMenu } from '@jupyterlab/ui-components';
- import { ArrayExt } from '@lumino/algorithm';
- import { CommandRegistry } from '@lumino/commands';
- import { Menu, MenuBar } from '@lumino/widgets';
- import { EditMenu } from './edit';
- import { FileMenu } from './file';
- import { HelpMenu } from './help';
- import { KernelMenu } from './kernel';
- import { RunMenu } from './run';
- import { SettingsMenu } from './settings';
- import { TabsMenu } from './tabs';
- import { IMainMenu } from './tokens';
- import { ViewMenu } from './view';
- /**
- * The main menu class. It is intended to be used as a singleton.
- */
- export class MainMenu extends MenuBar implements IMainMenu {
- /**
- * Construct the main menu bar.
- */
- constructor(commands: CommandRegistry) {
- super();
- this._commands = commands;
- }
- /**
- * The application "Edit" menu.
- */
- get editMenu(): EditMenu {
- if (!this._editMenu) {
- this._editMenu = new EditMenu({
- commands: this._commands,
- rank: 2,
- renderer: MenuSvg.defaultRenderer
- });
- }
- return this._editMenu;
- }
- /**
- * The application "File" menu.
- */
- get fileMenu(): FileMenu {
- if (!this._fileMenu) {
- this._fileMenu = new FileMenu({
- commands: this._commands,
- rank: 1,
- renderer: MenuSvg.defaultRenderer
- });
- }
- return this._fileMenu;
- }
- /**
- * The application "Help" menu.
- */
- get helpMenu(): HelpMenu {
- if (!this._helpMenu) {
- this._helpMenu = new HelpMenu({
- commands: this._commands,
- rank: 1000,
- renderer: MenuSvg.defaultRenderer
- });
- }
- return this._helpMenu;
- }
- /**
- * The application "Kernel" menu.
- */
- get kernelMenu(): KernelMenu {
- if (!this._kernelMenu) {
- this._kernelMenu = new KernelMenu({
- commands: this._commands,
- rank: 5,
- renderer: MenuSvg.defaultRenderer
- });
- }
- return this._kernelMenu;
- }
- /**
- * The application "Run" menu.
- */
- get runMenu(): RunMenu {
- if (!this._runMenu) {
- this._runMenu = new RunMenu({
- commands: this._commands,
- rank: 4,
- renderer: MenuSvg.defaultRenderer
- });
- }
- return this._runMenu;
- }
- /**
- * The application "Settings" menu.
- */
- get settingsMenu(): SettingsMenu {
- if (!this._settingsMenu) {
- this._settingsMenu = new SettingsMenu({
- commands: this._commands,
- rank: 999,
- renderer: MenuSvg.defaultRenderer
- });
- }
- return this._settingsMenu;
- }
- /**
- * The application "View" menu.
- */
- get viewMenu(): ViewMenu {
- if (!this._viewMenu) {
- this._viewMenu = new ViewMenu({
- commands: this._commands,
- rank: 3,
- renderer: MenuSvg.defaultRenderer
- });
- }
- return this._viewMenu;
- }
- /**
- * The application "Tabs" menu.
- */
- get tabsMenu(): TabsMenu {
- if (!this._tabsMenu) {
- this._tabsMenu = new TabsMenu({
- commands: this._commands,
- rank: 500,
- renderer: MenuSvg.defaultRenderer
- });
- }
- return this._tabsMenu;
- }
- /**
- * Add a new menu to the main menu bar.
- */
- addMenu(menu: Menu, options: IMainMenu.IAddOptions = {}): void {
- if (ArrayExt.firstIndexOf(this.menus, menu) > -1) {
- return;
- }
- // override default renderer with svg-supporting renderer
- MenuSvg.overrideDefaultRenderer(menu);
- const rank =
- 'rank' in options
- ? options.rank
- : 'rank' in menu
- ? (menu as any).rank
- : IRankedMenu.DEFAULT_RANK;
- const rankItem = { menu, rank };
- const index = ArrayExt.upperBound(this._items, rankItem, Private.itemCmp);
- // Upon disposal, remove the menu and its rank reference.
- menu.disposed.connect(this._onMenuDisposed, this);
- ArrayExt.insert(this._items, index, rankItem);
- /**
- * Create a new menu.
- */
- this.insertMenu(index, menu);
- // Link the menu to the API - backward compatibility when switching to menu description in settings
- switch (menu.id) {
- case 'jp-mainmenu-file':
- if (!this._fileMenu && menu instanceof FileMenu) {
- this._fileMenu = menu;
- }
- break;
- case 'jp-mainmenu-edit':
- if (!this._editMenu && menu instanceof EditMenu) {
- this._editMenu = menu;
- }
- break;
- case 'jp-mainmenu-view':
- if (!this._viewMenu && menu instanceof ViewMenu) {
- this._viewMenu = menu;
- }
- break;
- case 'jp-mainmenu-run':
- if (!this._runMenu && menu instanceof RunMenu) {
- this._runMenu = menu;
- }
- break;
- case 'jp-mainmenu-kernel':
- if (!this._kernelMenu && menu instanceof KernelMenu) {
- this._kernelMenu = menu;
- }
- break;
- case 'jp-mainmenu-tabs':
- if (!this._tabsMenu && menu instanceof TabsMenu) {
- this._tabsMenu = menu;
- }
- break;
- case 'jp-mainmenu-settings':
- if (!this._settingsMenu && menu instanceof SettingsMenu) {
- this._settingsMenu = menu;
- }
- break;
- case 'jp-mainmenu-help':
- if (!this._helpMenu && menu instanceof HelpMenu) {
- this._helpMenu = menu;
- }
- break;
- }
- }
- /**
- * Dispose of the resources held by the menu bar.
- */
- dispose(): void {
- this._editMenu?.dispose();
- this._fileMenu?.dispose();
- this._helpMenu?.dispose();
- this._kernelMenu?.dispose();
- this._runMenu?.dispose();
- this._settingsMenu?.dispose();
- this._viewMenu?.dispose();
- this._tabsMenu?.dispose();
- super.dispose();
- }
- /**
- * Generate the menu.
- *
- * @param commands The command registry
- * @param options The main menu options.
- * @param trans - The application language translator.
- */
- static generateMenu(
- commands: CommandRegistry,
- options: IMainMenu.IMenuOptions,
- trans: TranslationBundle
- ): RankedMenu {
- let menu: RankedMenu;
- const { id, label, rank } = options;
- switch (id) {
- case 'jp-mainmenu-file':
- menu = new FileMenu({
- commands,
- rank,
- renderer: MenuSvg.defaultRenderer
- });
- break;
- case 'jp-mainmenu-edit':
- menu = new EditMenu({
- commands,
- rank,
- renderer: MenuSvg.defaultRenderer
- });
- break;
- case 'jp-mainmenu-view':
- menu = new ViewMenu({
- commands,
- rank,
- renderer: MenuSvg.defaultRenderer
- });
- break;
- case 'jp-mainmenu-run':
- menu = new RunMenu({
- commands,
- rank,
- renderer: MenuSvg.defaultRenderer
- });
- break;
- case 'jp-mainmenu-kernel':
- menu = new KernelMenu({
- commands,
- rank,
- renderer: MenuSvg.defaultRenderer
- });
- break;
- case 'jp-mainmenu-tabs':
- menu = new TabsMenu({
- commands,
- rank,
- renderer: MenuSvg.defaultRenderer
- });
- break;
- case 'jp-mainmenu-settings':
- menu = new SettingsMenu({
- commands,
- rank,
- renderer: MenuSvg.defaultRenderer
- });
- break;
- case 'jp-mainmenu-help':
- menu = new HelpMenu({
- commands,
- rank,
- renderer: MenuSvg.defaultRenderer
- });
- break;
- default:
- menu = new RankedMenu({
- commands,
- rank,
- renderer: MenuSvg.defaultRenderer
- });
- }
- if (label) {
- menu.title.label = trans._p('menu', label);
- }
- return menu;
- }
- /**
- * Handle the disposal of a menu.
- */
- private _onMenuDisposed(menu: Menu): void {
- this.removeMenu(menu);
- const index = ArrayExt.findFirstIndex(
- this._items,
- item => item.menu === menu
- );
- if (index !== -1) {
- ArrayExt.removeAt(this._items, index);
- }
- }
- private _commands: CommandRegistry;
- private _items: Private.IRankItem[] = [];
- private _editMenu: EditMenu;
- private _fileMenu: FileMenu;
- private _helpMenu: HelpMenu;
- private _kernelMenu: KernelMenu;
- private _runMenu: RunMenu;
- private _settingsMenu: SettingsMenu;
- private _viewMenu: ViewMenu;
- private _tabsMenu: TabsMenu;
- }
- /**
- * A namespace for private data.
- */
- namespace Private {
- /**
- * An object which holds a menu and its sort rank.
- */
- export interface IRankItem {
- /**
- * The menu for the item.
- */
- menu: Menu;
- /**
- * The sort rank of the menu.
- */
- rank: number;
- }
- /**
- * A comparator function for menu rank items.
- */
- export function itemCmp(first: IRankItem, second: IRankItem): number {
- return first.rank - second.rank;
- }
- }
|