@opensumi/ide-core-browser 2.21.8-rc-1670567192.0 → 2.21.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/components/actions/index.d.ts.map +1 -1
- package/lib/components/actions/index.js +22 -2
- package/lib/components/actions/index.js.map +1 -1
- package/lib/components/tree/tree.module.less +0 -1
- package/lib/contextkey/testing.d.ts +0 -1
- package/lib/contextkey/testing.d.ts.map +1 -1
- package/lib/contextkey/testing.js +1 -2
- package/lib/contextkey/testing.js.map +1 -1
- package/lib/menu/next/menu.contrib.interface.d.ts +2 -3
- package/lib/menu/next/menu.contrib.interface.d.ts.map +1 -1
- package/lib/menu/next/menu.contrib.interface.js.map +1 -1
- package/lib/preferences/preference-configurations.js +1 -1
- package/lib/preferences/preference-configurations.js.map +1 -1
- package/lib/react-providers/config-provider.d.ts +0 -4
- package/lib/react-providers/config-provider.d.ts.map +1 -1
- package/lib/react-providers/config-provider.js.map +1 -1
- package/lib/services/storage-service.d.ts.map +1 -1
- package/lib/services/storage-service.js +1 -7
- package/lib/services/storage-service.js.map +1 -1
- package/lib/utils/label.d.ts.map +1 -1
- package/lib/utils/label.js +9 -16
- package/lib/utils/label.js.map +1 -1
- package/package.json +6 -7
- package/src/application/application-state-service.ts +0 -54
- package/src/application/application.service.ts +0 -51
- package/src/application/index.ts +0 -2
- package/src/authentication/authentication.contribution.ts +0 -35
- package/src/authentication/authentication.service.ts +0 -517
- package/src/bootstrap/app.ts +0 -745
- package/src/bootstrap/app.view.tsx +0 -88
- package/src/bootstrap/connection.ts +0 -116
- package/src/bootstrap/index.ts +0 -3
- package/src/bootstrap/inner-providers.ts +0 -297
- package/src/bootstrap/lifecycle.service.ts +0 -19
- package/src/browser-module.ts +0 -24
- package/src/common/common.command.ts +0 -977
- package/src/common/common.contribution.ts +0 -343
- package/src/common/common.define.ts +0 -55
- package/src/common/common.module.ts +0 -33
- package/src/common/common.storage.ts +0 -22
- package/src/common/container-id.ts +0 -12
- package/src/common/index.ts +0 -4
- package/src/components/actions/index.tsx +0 -486
- package/src/components/actions/placements.ts +0 -47
- package/src/components/actions/styles.module.less +0 -144
- package/src/components/badge/index.tsx +0 -1
- package/src/components/index.ts +0 -26
- package/src/components/layout/box-panel.tsx +0 -88
- package/src/components/layout/default-layout.tsx +0 -61
- package/src/components/layout/index.ts +0 -4
- package/src/components/layout/layout.ts +0 -80
- package/src/components/layout/split-panel.service.ts +0 -56
- package/src/components/layout/split-panel.tsx +0 -296
- package/src/components/layout/styles.module.less +0 -21
- package/src/components/loading/index.ts +0 -1
- package/src/components/loading/loading.less +0 -14
- package/src/components/loading/loading.view.tsx +0 -7
- package/src/components/loading/media/loading-dark.svg +0 -52
- package/src/components/loading/media/loading-hc.svg +0 -52
- package/src/components/loading/media/loading.svg +0 -52
- package/src/components/popover/styles.module.less +0 -81
- package/src/components/portal/index.tsx +0 -13
- package/src/components/progressbar/index.tsx +0 -16
- package/src/components/progressbar/styles.module.less +0 -31
- package/src/components/recycle-tree/index.ts +0 -1
- package/src/components/recycle-tree/recycle-tree.view.tsx +0 -368
- package/src/components/resize/resize.module.less +0 -78
- package/src/components/resize/resize.tsx +0 -663
- package/src/components/scroll/index.tsx +0 -386
- package/src/components/scroll/scroll.module.less +0 -108
- package/src/components/scrollbar/index.ts +0 -1
- package/src/components/scrollbar/scrollbar.less +0 -36
- package/src/components/scrollbar/scrollbar.view.ts +0 -8
- package/src/components/select/index.tsx +0 -12
- package/src/components/select/styles.less +0 -6
- package/src/components/tree/index.ts +0 -3
- package/src/components/tree/tree-node.view.tsx +0 -546
- package/src/components/tree/tree.module.less +0 -297
- package/src/components/tree/tree.view.tsx +0 -486
- package/src/context-key.ts +0 -48
- package/src/contextkey/dialog.ts +0 -3
- package/src/contextkey/explorer.ts +0 -26
- package/src/contextkey/index.ts +0 -6
- package/src/contextkey/outline.ts +0 -4
- package/src/contextkey/resource.ts +0 -61
- package/src/contextkey/terminal.ts +0 -7
- package/src/contextkey/testing.ts +0 -9
- package/src/contextkey/workspace.ts +0 -7
- package/src/core-preferences.ts +0 -318
- package/src/dom/index.ts +0 -176
- package/src/encoding-registry.ts +0 -83
- package/src/extensions/extensions-point.service.ts +0 -78
- package/src/extensions/index.ts +0 -3
- package/src/extensions/schema/browserViews.ts +0 -96
- package/src/extensions/schema/menu.ts +0 -245
- package/src/extensions/schema/opensumiExtensionPackageSchema.ts +0 -12
- package/src/extensions/schema/toolbar.ts +0 -338
- package/src/extensions/schema/vscodeExtensionPackageSchema.ts +0 -330
- package/src/fs/index.ts +0 -12
- package/src/hash-calculate/hash-calculate.contribution.ts +0 -19
- package/src/index.ts +0 -42
- package/src/keybinding/index.ts +0 -1
- package/src/keybinding/keybinding.ts +0 -908
- package/src/keyboard/index.ts +0 -3
- package/src/keyboard/keyboard-layout-provider.ts +0 -412
- package/src/keyboard/keyboard-layout-service.ts +0 -449
- package/src/keyboard/keys.ts +0 -748
- package/src/keyboard/layouts/_.contribution.ts +0 -24
- package/src/keyboard/layouts/cz.win.ts +0 -168
- package/src/keyboard/layouts/de-swiss.win.ts +0 -168
- package/src/keyboard/layouts/de.darwin.ts +0 -131
- package/src/keyboard/layouts/de.linux.ts +0 -186
- package/src/keyboard/layouts/de.win.ts +0 -168
- package/src/keyboard/layouts/dk.win.ts +0 -168
- package/src/keyboard/layouts/dvorak.darwin.ts +0 -131
- package/src/keyboard/layouts/en-belgian.win.ts +0 -168
- package/src/keyboard/layouts/en-ext.darwin.ts +0 -131
- package/src/keyboard/layouts/en-in.win.ts +0 -168
- package/src/keyboard/layouts/en-intl.darwin.ts +0 -131
- package/src/keyboard/layouts/en-intl.win.ts +0 -168
- package/src/keyboard/layouts/en-uk.darwin.ts +0 -131
- package/src/keyboard/layouts/en-uk.win.ts +0 -168
- package/src/keyboard/layouts/en.darwin.ts +0 -139
- package/src/keyboard/layouts/en.linux.ts +0 -186
- package/src/keyboard/layouts/en.win.ts +0 -173
- package/src/keyboard/layouts/es-latin.win.ts +0 -168
- package/src/keyboard/layouts/es.darwin.ts +0 -131
- package/src/keyboard/layouts/es.linux.ts +0 -186
- package/src/keyboard/layouts/es.win.ts +0 -168
- package/src/keyboard/layouts/fr.darwin.ts +0 -131
- package/src/keyboard/layouts/fr.linux.ts +0 -186
- package/src/keyboard/layouts/fr.win.ts +0 -168
- package/src/keyboard/layouts/hu.win.ts +0 -168
- package/src/keyboard/layouts/it.darwin.ts +0 -131
- package/src/keyboard/layouts/it.win.ts +0 -168
- package/src/keyboard/layouts/jp-roman.darwin.ts +0 -131
- package/src/keyboard/layouts/jp.darwin.ts +0 -131
- package/src/keyboard/layouts/ko.darwin.ts +0 -131
- package/src/keyboard/layouts/layout.contribution.darwin.ts +0 -23
- package/src/keyboard/layouts/layout.contribution.linux.ts +0 -12
- package/src/keyboard/layouts/layout.contribution.ts +0 -9
- package/src/keyboard/layouts/layout.contribution.win.ts +0 -29
- package/src/keyboard/layouts/no.win.ts +0 -168
- package/src/keyboard/layouts/pl.darwin.ts +0 -131
- package/src/keyboard/layouts/pl.win.ts +0 -168
- package/src/keyboard/layouts/pt-br.win.ts +0 -169
- package/src/keyboard/layouts/pt.darwin.ts +0 -131
- package/src/keyboard/layouts/pt.win.ts +0 -168
- package/src/keyboard/layouts/ru.darwin.ts +0 -131
- package/src/keyboard/layouts/ru.linux.ts +0 -186
- package/src/keyboard/layouts/ru.win.ts +0 -168
- package/src/keyboard/layouts/sv.darwin.ts +0 -131
- package/src/keyboard/layouts/sv.win.ts +0 -168
- package/src/keyboard/layouts/thai.win.ts +0 -168
- package/src/keyboard/layouts/tr.win.ts +0 -168
- package/src/keyboard/layouts/zh-hans.darwin.ts +0 -131
- package/src/layout/accordion/tab-bar-toolbar.tsx +0 -59
- package/src/layout/accordion/view-context-key.registry.ts +0 -34
- package/src/layout/constants.ts +0 -7
- package/src/layout/index.ts +0 -5
- package/src/layout/layout-hooks.ts +0 -68
- package/src/layout/layout-state.ts +0 -107
- package/src/layout/layout.interface.ts +0 -101
- package/src/layout/layout.ts +0 -80
- package/src/layout/view-id.ts +0 -18
- package/src/logger/browser-logger.ts +0 -51
- package/src/logger/index.ts +0 -1
- package/src/markdown/index.tsx +0 -62
- package/src/menu/next/base.ts +0 -513
- package/src/menu/next/ctxmenu-service.ts +0 -188
- package/src/menu/next/index.ts +0 -10
- package/src/menu/next/menu-id.ts +0 -86
- package/src/menu/next/menu-service.ts +0 -252
- package/src/menu/next/menu-util.ts +0 -77
- package/src/menu/next/menu.contrib.interface.ts +0 -79
- package/src/menu/next/menu.interface.ts +0 -253
- package/src/menu/next/menubar-service.ts +0 -211
- package/src/menu/next/renderer/ctxmenu/base.ts +0 -18
- package/src/menu/next/renderer/ctxmenu/browser.ts +0 -45
- package/src/menu/next/renderer/ctxmenu/electron.ts +0 -207
- package/src/menu/next/toolbar-action.service.ts +0 -132
- package/src/monaco/index.ts +0 -128
- package/src/opener/command-opener.ts +0 -42
- package/src/opener/default-opener.ts +0 -31
- package/src/opener/http-opener.ts +0 -25
- package/src/opener/index.ts +0 -19
- package/src/opener/opener.contribution.ts +0 -57
- package/src/opener/opener.service.ts +0 -66
- package/src/preferences/early-preferences.ts +0 -117
- package/src/preferences/index.ts +0 -9
- package/src/preferences/preference-configurations.ts +0 -77
- package/src/preferences/preference-contribution.ts +0 -401
- package/src/preferences/preference-provider.ts +0 -414
- package/src/preferences/preference-proxy.ts +0 -292
- package/src/preferences/preference-scope.ts +0 -3
- package/src/preferences/preference-service.ts +0 -571
- package/src/preferences/settings.ts +0 -53
- package/src/preferences/types.ts +0 -111
- package/src/progress/index.ts +0 -58
- package/src/progress/progress-bar.tsx +0 -22
- package/src/progress/progress-indicator.ts +0 -90
- package/src/progress/progress.module.less +0 -46
- package/src/progress/progress.service.tsx +0 -429
- package/src/quick-open/index.ts +0 -655
- package/src/quick-open/recent-files.ts +0 -68
- package/src/raw-context-key.ts +0 -116
- package/src/react-hooks/event.tsx +0 -80
- package/src/react-hooks/hot-key.tsx +0 -58
- package/src/react-hooks/index.ts +0 -3
- package/src/react-hooks/injectable-hooks.tsx +0 -35
- package/src/react-hooks/portal-hooks.tsx +0 -38
- package/src/react-providers/config-provider.tsx +0 -263
- package/src/react-providers/index.tsx +0 -2
- package/src/react-providers/slot.module.less +0 -19
- package/src/react-providers/slot.tsx +0 -242
- package/src/services/clipboard.service.ts +0 -97
- package/src/services/credentials-service.ts +0 -91
- package/src/services/crypto-service.ts +0 -23
- package/src/services/external-uri.service.ts +0 -68
- package/src/services/index.ts +0 -7
- package/src/services/label-service.ts +0 -386
- package/src/services/status-bar-service.ts +0 -108
- package/src/services/storage-service.ts +0 -197
- package/src/style/codicons/README.md +0 -22
- package/src/style/codicons/codicon-animations.css +0 -15
- package/src/style/codicons/generator.js +0 -15
- package/src/style/entry.less +0 -25
- package/src/style/icon/fileicons/file-default.svg +0 -1
- package/src/style/icon/fileicons/folder-default.svg +0 -1
- package/src/style/icon/fileicons.less +0 -20
- package/src/style/icon/icon.ts +0 -543
- package/src/style/icon/ide-iconfont.ts +0 -13
- package/src/style/icon/index.less +0 -54
- package/src/style/icon/seti.woff +0 -0
- package/src/style/icon/symbol-icons/boolean-dark.svg +0 -3
- package/src/style/icon/symbol-icons/boolean-light.svg +0 -3
- package/src/style/icon/symbol-icons/class-dark.svg +0 -3
- package/src/style/icon/symbol-icons/class-light.svg +0 -3
- package/src/style/icon/symbol-icons/constant-dark.svg +0 -4
- package/src/style/icon/symbol-icons/constant-light.svg +0 -4
- package/src/style/icon/symbol-icons/enumerator-dark.svg +0 -3
- package/src/style/icon/symbol-icons/enumerator-item-dark.svg +0 -3
- package/src/style/icon/symbol-icons/enumerator-item-light.svg +0 -3
- package/src/style/icon/symbol-icons/enumerator-light.svg +0 -3
- package/src/style/icon/symbol-icons/event-dark.svg +0 -3
- package/src/style/icon/symbol-icons/event-light.svg +0 -3
- package/src/style/icon/symbol-icons/field-dark.svg +0 -3
- package/src/style/icon/symbol-icons/field-light.svg +0 -3
- package/src/style/icon/symbol-icons/file-dark.svg +0 -3
- package/src/style/icon/symbol-icons/file-light.svg +0 -3
- package/src/style/icon/symbol-icons/indexer-dark.svg +0 -3
- package/src/style/icon/symbol-icons/indexer-light.svg +0 -3
- package/src/style/icon/symbol-icons/interface-dark.svg +0 -3
- package/src/style/icon/symbol-icons/interface-light.svg +0 -3
- package/src/style/icon/symbol-icons/keyword-dark.svg +0 -3
- package/src/style/icon/symbol-icons/keyword-light.svg +0 -3
- package/src/style/icon/symbol-icons/method-dark.svg +0 -3
- package/src/style/icon/symbol-icons/method-light.svg +0 -3
- package/src/style/icon/symbol-icons/namespace-dark.svg +0 -3
- package/src/style/icon/symbol-icons/namespace-light.svg +0 -3
- package/src/style/icon/symbol-icons/numeric-dark.svg +0 -3
- package/src/style/icon/symbol-icons/numeric-light.svg +0 -3
- package/src/style/icon/symbol-icons/operator-dark.svg +0 -3
- package/src/style/icon/symbol-icons/operator-light.svg +0 -3
- package/src/style/icon/symbol-icons/property-dark.svg +0 -3
- package/src/style/icon/symbol-icons/property-light.svg +0 -3
- package/src/style/icon/symbol-icons/snippet-dark.svg +0 -3
- package/src/style/icon/symbol-icons/snippet-light.svg +0 -3
- package/src/style/icon/symbol-icons/string-dark.svg +0 -3
- package/src/style/icon/symbol-icons/string-light.svg +0 -3
- package/src/style/icon/symbol-icons/structure-dark.svg +0 -3
- package/src/style/icon/symbol-icons/structure-light.svg +0 -3
- package/src/style/icon/symbol-icons/symbol-icons.css +0 -284
- package/src/style/icon/symbol-icons/template-dark.svg +0 -3
- package/src/style/icon/symbol-icons/template-light.svg +0 -3
- package/src/style/icon/symbol-icons/variable-dark.svg +0 -3
- package/src/style/icon/symbol-icons/variable-light.svg +0 -3
- package/src/style/icon.less +0 -8
- package/src/style/index.less +0 -14
- package/src/style/monaco-override.less +0 -116
- package/src/style/normalize.less +0 -92
- package/src/style/octicons/octicons-cdn.css +0 -720
- package/src/style/octicons/octicons.css +0 -714
- package/src/style/octicons/octicons.html +0 -1882
- package/src/style/octicons/octicons.svg +0 -582
- package/src/style/octicons/octicons.ttf +0 -0
- package/src/style/override.less +0 -97
- package/src/style/toolbar.less +0 -199
- package/src/style/utilities.less +0 -8
- package/src/style/variable.less +0 -8
- package/src/terminal/index.ts +0 -7
- package/src/toolbar/components/auto-complete.tsx +0 -0
- package/src/toolbar/components/button.tsx +0 -440
- package/src/toolbar/components/index.ts +0 -2
- package/src/toolbar/components/select.tsx +0 -189
- package/src/toolbar/index.ts +0 -3
- package/src/toolbar/toolbar.popover.registry.ts +0 -32
- package/src/toolbar/toolbar.registry.ts +0 -352
- package/src/toolbar/toolbar.tsx +0 -710
- package/src/toolbar/types.ts +0 -383
- package/src/tree/index.ts +0 -3
- package/src/tree/tree-expansion.ts +0 -25
- package/src/tree/tree-selection.ts +0 -89
- package/src/tree/tree.ts +0 -294
- package/src/utils/create-overlay.tsx +0 -53
- package/src/utils/electron.ts +0 -92
- package/src/utils/env.ts +0 -26
- package/src/utils/icon.ts +0 -13
- package/src/utils/index.ts +0 -7
- package/src/utils/json.ts +0 -251
- package/src/utils/label.tsx +0 -36
- package/src/utils/parse.ts +0 -72
- package/src/utils/react-hooks.ts +0 -118
- package/src/variable/index.ts +0 -1
- package/src/variable/variable.ts +0 -84
- package/src/window/index.ts +0 -34
- package/src/window/window.service.ts +0 -100
package/src/menu/next/base.ts
DELETED
|
@@ -1,513 +0,0 @@
|
|
|
1
|
-
import ReactIs from 'react-is';
|
|
2
|
-
|
|
3
|
-
import { Injectable, Autowired } from '@opensumi/di';
|
|
4
|
-
import { ButtonType } from '@opensumi/ide-components';
|
|
5
|
-
import { warning } from '@opensumi/ide-components/lib/utils';
|
|
6
|
-
import {
|
|
7
|
-
replaceLocalizePlaceholder,
|
|
8
|
-
ILogger,
|
|
9
|
-
Disposable,
|
|
10
|
-
combinedDisposable,
|
|
11
|
-
CommandRegistry,
|
|
12
|
-
IDisposable,
|
|
13
|
-
Event,
|
|
14
|
-
Emitter,
|
|
15
|
-
Command,
|
|
16
|
-
ContributionProvider,
|
|
17
|
-
ISumiMenuExtendInfo,
|
|
18
|
-
} from '@opensumi/ide-core-common';
|
|
19
|
-
import { ContextKeyExpr } from '@opensumi/monaco-editor-core/esm/vs/platform/contextkey/common/contextkey';
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
import { MenuId } from './menu-id';
|
|
23
|
-
|
|
24
|
-
export const MenuContribution = Symbol('MenuContribution');
|
|
25
|
-
export interface MenuContribution {
|
|
26
|
-
/**
|
|
27
|
-
* @deprecated 请使用 registerMenus
|
|
28
|
-
*/
|
|
29
|
-
registerNextMenus?(menus: IMenuRegistry): void;
|
|
30
|
-
registerMenus?(menus: IMenuRegistry): void;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* @deprecated 请使用 NextMenuContribution
|
|
35
|
-
*/
|
|
36
|
-
export const NextMenuContribution = MenuContribution;
|
|
37
|
-
/**
|
|
38
|
-
* @deprecated 请使用 NextMenuContribution
|
|
39
|
-
*/
|
|
40
|
-
export type NextMenuContribution = MenuContribution;
|
|
41
|
-
|
|
42
|
-
type PartialBy<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;
|
|
43
|
-
|
|
44
|
-
export interface MenuCommandDesc {
|
|
45
|
-
id: string;
|
|
46
|
-
label: string;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
interface ICoreMenuItem {
|
|
50
|
-
order?: number;
|
|
51
|
-
/**
|
|
52
|
-
* 决定是否在视图层展示
|
|
53
|
-
*/
|
|
54
|
-
when?: string | ContextKeyExpr;
|
|
55
|
-
// 以下为 sumi 拓展的属性
|
|
56
|
-
/**
|
|
57
|
-
* 单独变更此 menu action 的 args
|
|
58
|
-
*/
|
|
59
|
-
argsTransformer?: (...args: any[]) => any[];
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
interface IBaseMenuItem extends ICoreMenuItem {
|
|
63
|
-
group?: 'navigation' | string;
|
|
64
|
-
/**
|
|
65
|
-
* 图标的名称
|
|
66
|
-
* 当 menu 在 InlineActionBar 出现时,使用的 iconClass
|
|
67
|
-
* 如果这个值不存在,则默认跟随 command 的 iconClass
|
|
68
|
-
* 如果command的icon也不存在,使用 command 的 label
|
|
69
|
-
*/
|
|
70
|
-
iconClass?: string;
|
|
71
|
-
/**
|
|
72
|
-
* electron native 菜单使用
|
|
73
|
-
*/
|
|
74
|
-
nativeRole?: string;
|
|
75
|
-
/**
|
|
76
|
-
* 决定 menu 渲染的类型
|
|
77
|
-
* 默认值为 icon
|
|
78
|
-
*/
|
|
79
|
-
type?: IMenuActionDisplayType;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
export interface IComponentMenuItemProps {
|
|
83
|
-
getExecuteArgs: () => any[];
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
/**
|
|
87
|
-
* 有限开放,目前仅支持 navigation 的 group,也不支持 context 系列的位置
|
|
88
|
-
*/
|
|
89
|
-
interface IInternalComponentMenuItem extends ICoreMenuItem {
|
|
90
|
-
/**
|
|
91
|
-
* 单个 menu 支持传入额外参数
|
|
92
|
-
*/
|
|
93
|
-
extraTailArgs?: any[];
|
|
94
|
-
/**
|
|
95
|
-
* 组件形式的 menu item
|
|
96
|
-
*/
|
|
97
|
-
component: React.ComponentType<IComponentMenuItemProps>;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
export interface IComponentMenuItem extends IInternalComponentMenuItem {
|
|
101
|
-
/**
|
|
102
|
-
* group 默认为 `navigation`
|
|
103
|
-
*/
|
|
104
|
-
group: 'navigation';
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
export interface IMenuItem extends IBaseMenuItem {
|
|
108
|
-
command: string | MenuCommandDesc;
|
|
109
|
-
// 以下为 sumi 拓展的属性
|
|
110
|
-
/**
|
|
111
|
-
* 单个 menu 支持传入额外参数
|
|
112
|
-
*/
|
|
113
|
-
extraTailArgs?: any[];
|
|
114
|
-
/**
|
|
115
|
-
* 决定 toggled 状态
|
|
116
|
-
* more-dropdown 中主要表现为文字左侧有一个 ✅
|
|
117
|
-
* icon 则表现为 背景色选中 状态
|
|
118
|
-
*/
|
|
119
|
-
toggledWhen?: string | ContextKeyExpr;
|
|
120
|
-
/**
|
|
121
|
-
* 决定 disabled 状态,主要表现为 menu item 颜色变灰
|
|
122
|
-
*/
|
|
123
|
-
enabledWhen?: string | ContextKeyExpr;
|
|
124
|
-
/**
|
|
125
|
-
* 菜单栏最右侧显示的额外信息
|
|
126
|
-
*/
|
|
127
|
-
extraDesc?: string;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
export interface ISubmenuItem extends IBaseMenuItem {
|
|
131
|
-
submenu: MenuId | string;
|
|
132
|
-
/**
|
|
133
|
-
* 支持国际化占位符,例如 %evenEditorGroups%
|
|
134
|
-
*/
|
|
135
|
-
label?: string;
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
export type ICommandsMap = Map<string, Command>;
|
|
139
|
-
|
|
140
|
-
export abstract class IMenuRegistry {
|
|
141
|
-
readonly onDidChangeMenubar: Event<string>;
|
|
142
|
-
abstract registerMenubarItem(menuId: string, item: PartialBy<IMenubarItem, 'id'>): IDisposable;
|
|
143
|
-
abstract removeMenubarItem(menuId: string): void;
|
|
144
|
-
abstract getMenubarItem(menuId: string): IMenubarItem | undefined;
|
|
145
|
-
abstract getMenubarItems(): Array<IMenubarItem>;
|
|
146
|
-
|
|
147
|
-
readonly onDidChangeMenu: Event<string>;
|
|
148
|
-
|
|
149
|
-
abstract getMenuCommand(command: string | MenuCommandDesc): PartialBy<MenuCommandDesc, 'label'>;
|
|
150
|
-
abstract registerMenuExtendInfo(menuId: MenuId | string, items: Array<ISumiMenuExtendInfo>);
|
|
151
|
-
abstract registerMenuItem(
|
|
152
|
-
menuId: MenuId | string,
|
|
153
|
-
item: IMenuItem | ISubmenuItem | IInternalComponentMenuItem,
|
|
154
|
-
): IDisposable;
|
|
155
|
-
abstract unregisterMenuItem(menuId: MenuId | string, menuItemId: string): void;
|
|
156
|
-
abstract registerMenuItems(
|
|
157
|
-
menuId: MenuId | string,
|
|
158
|
-
items: Array<IMenuItem | ISubmenuItem | IInternalComponentMenuItem>,
|
|
159
|
-
): IDisposable;
|
|
160
|
-
abstract unregisterMenuId(menuId: string): IDisposable;
|
|
161
|
-
abstract getMenuItems(menuId: MenuId | string): Array<IMenuItem | ISubmenuItem | IComponentMenuItem>;
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
export interface IMenubarItem {
|
|
165
|
-
id: string; // 作为 menu-id 注册进来
|
|
166
|
-
label: string;
|
|
167
|
-
order?: number;
|
|
168
|
-
nativeRole?: string; // electron menu 使用
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
@Injectable()
|
|
172
|
-
export class CoreMenuRegistryImpl implements IMenuRegistry {
|
|
173
|
-
// 目前只支持 `EditorTitle` 开放 `ComponentMenuItem`
|
|
174
|
-
static EnableComponentMenuIds: Array<MenuId | string> = [MenuId.EditorTitle];
|
|
175
|
-
|
|
176
|
-
private readonly _menubarItems = new Map<string, IMenubarItem>();
|
|
177
|
-
|
|
178
|
-
private readonly _onDidChangeMenubar = new Emitter<string>();
|
|
179
|
-
readonly onDidChangeMenubar: Event<string> = this._onDidChangeMenubar.event;
|
|
180
|
-
|
|
181
|
-
private readonly _menuItems = new Map<string, Array<IMenuItem | ISubmenuItem | IComponentMenuItem>>();
|
|
182
|
-
private readonly _menuExtendInfo = new Map<string, Array<ISumiMenuExtendInfo>>();
|
|
183
|
-
|
|
184
|
-
private readonly _onDidChangeMenu = new Emitter<string>();
|
|
185
|
-
readonly onDidChangeMenu: Event<string> = this._onDidChangeMenu.event;
|
|
186
|
-
|
|
187
|
-
// 记录被禁用的 menu-id
|
|
188
|
-
private readonly _disabledMenuIds = new Set<string>();
|
|
189
|
-
|
|
190
|
-
@Autowired(MenuContribution)
|
|
191
|
-
protected readonly contributions: ContributionProvider<MenuContribution>;
|
|
192
|
-
|
|
193
|
-
@Autowired(CommandRegistry)
|
|
194
|
-
private readonly commandRegistry: CommandRegistry;
|
|
195
|
-
|
|
196
|
-
@Autowired(ILogger)
|
|
197
|
-
private readonly logger: ILogger;
|
|
198
|
-
|
|
199
|
-
/**
|
|
200
|
-
* 这里的注册只允许注册一次
|
|
201
|
-
*/
|
|
202
|
-
registerMenubarItem(menuId: string, item: PartialBy<IMenubarItem, 'id'>): IDisposable {
|
|
203
|
-
// 将 menuId 存到结构中去
|
|
204
|
-
const menubarItem = { ...item, id: menuId } as IMenubarItem;
|
|
205
|
-
const existedItem = this._menubarItems.get(menuId);
|
|
206
|
-
if (existedItem) {
|
|
207
|
-
this.logger.warn(`this menuId ${menuId} already existed`);
|
|
208
|
-
return Disposable.NULL;
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
this._menubarItems.set(menuId, menubarItem);
|
|
212
|
-
this._onDidChangeMenubar.fire(menuId);
|
|
213
|
-
|
|
214
|
-
return Disposable.create(() => this.removeMenubarItem(menuId));
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
removeMenubarItem(menuId: string) {
|
|
218
|
-
const item = this._menubarItems.get(menuId);
|
|
219
|
-
if (item) {
|
|
220
|
-
this._menubarItems.delete(menuId);
|
|
221
|
-
this._onDidChangeMenubar.fire(menuId);
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
getMenubarItem(menuId: string): IMenubarItem | undefined {
|
|
226
|
-
return this._menubarItems.get(menuId);
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
getMenubarItems(): IMenubarItem[] {
|
|
230
|
-
const menubarIds = Array.from(this._menubarItems.keys());
|
|
231
|
-
return menubarIds.reduce((prev, menubarId) => {
|
|
232
|
-
const menubarItem = this._menubarItems.get(menubarId);
|
|
233
|
-
if (menubarItem) {
|
|
234
|
-
prev.push(menubarItem);
|
|
235
|
-
}
|
|
236
|
-
return prev;
|
|
237
|
-
}, [] as IMenubarItem[]);
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
registerMenuExtendInfo(menuId: MenuId | string, item: Array<ISumiMenuExtendInfo>): IDisposable {
|
|
241
|
-
this._menuExtendInfo.set(menuId, item);
|
|
242
|
-
|
|
243
|
-
return Disposable.create(() => this._menuExtendInfo.delete(menuId));
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
registerMenuItem(menuId: MenuId | string, item: IMenuItem | ISubmenuItem): IDisposable {
|
|
247
|
-
let array = this._menuItems.get(menuId);
|
|
248
|
-
if (!array) {
|
|
249
|
-
array = [item];
|
|
250
|
-
this._menuItems.set(menuId, array);
|
|
251
|
-
} else {
|
|
252
|
-
array.push(item);
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
this._onDidChangeMenu.fire(menuId);
|
|
256
|
-
|
|
257
|
-
return Disposable.create(() => {
|
|
258
|
-
const idx = array!.indexOf(item);
|
|
259
|
-
if (idx >= 0) {
|
|
260
|
-
array!.splice(idx, 1);
|
|
261
|
-
this._onDidChangeMenu.fire(menuId);
|
|
262
|
-
}
|
|
263
|
-
});
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
unregisterMenuItem(menuId: MenuId | string, menuItemId: string): void {
|
|
267
|
-
const array = this._menuItems.get(menuId);
|
|
268
|
-
if (array) {
|
|
269
|
-
const idx = array.findIndex((item) => {
|
|
270
|
-
const command: string | MenuCommandDesc = (item as IMenuItem).command;
|
|
271
|
-
if (command) {
|
|
272
|
-
if (typeof command === 'string') {
|
|
273
|
-
return command === menuItemId;
|
|
274
|
-
}
|
|
275
|
-
return command.id === menuItemId;
|
|
276
|
-
} else {
|
|
277
|
-
return (item as ISubmenuItem).submenu === menuItemId;
|
|
278
|
-
}
|
|
279
|
-
});
|
|
280
|
-
if (idx >= 0) {
|
|
281
|
-
array.splice(idx, 1);
|
|
282
|
-
this._onDidChangeMenu.fire(menuId);
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
registerMenuItems(menuId: string, items: (IMenuItem | ISubmenuItem)[]): IDisposable {
|
|
288
|
-
const disposables = [] as IDisposable[];
|
|
289
|
-
items.forEach((item) => {
|
|
290
|
-
disposables.push(this.registerMenuItem(menuId, item));
|
|
291
|
-
});
|
|
292
|
-
|
|
293
|
-
return combinedDisposable(disposables);
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
unregisterMenuId(menuId: string): IDisposable {
|
|
297
|
-
this._disabledMenuIds.add(menuId);
|
|
298
|
-
this._onDidChangeMenu.fire(menuId);
|
|
299
|
-
|
|
300
|
-
return Disposable.create(() => {
|
|
301
|
-
const deleted = this._disabledMenuIds.delete(menuId);
|
|
302
|
-
if (deleted) {
|
|
303
|
-
this._onDidChangeMenu.fire(menuId);
|
|
304
|
-
}
|
|
305
|
-
});
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
getMenuItems(id: MenuId | string): Array<IMenuItem | ISubmenuItem | IComponentMenuItem> {
|
|
309
|
-
// 将 disable 掉的 MenuId 返回为空
|
|
310
|
-
if (this._disabledMenuIds.has(id)) {
|
|
311
|
-
return [];
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
const result = (this._menuItems.get(id) || []).slice(0).reduce((prev, cur) => {
|
|
315
|
-
if (isIComponentMenuItem(cur)) {
|
|
316
|
-
// 目前只支持 `EditorTitle` 开放 `ComponentMenuItem`
|
|
317
|
-
if (CoreMenuRegistryImpl.EnableComponentMenuIds.includes(id)) {
|
|
318
|
-
prev.push({
|
|
319
|
-
...cur,
|
|
320
|
-
group: 'navigation',
|
|
321
|
-
});
|
|
322
|
-
}
|
|
323
|
-
} else {
|
|
324
|
-
prev.push(cur);
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
return prev;
|
|
328
|
-
}, [] as Array<IMenuItem | ISubmenuItem | IComponentMenuItem>);
|
|
329
|
-
|
|
330
|
-
if (id === MenuId.CommandPalette) {
|
|
331
|
-
// CommandPalette 特殊处理, 默认展示所有的 command
|
|
332
|
-
// CommandPalette 负责添加 when 条件
|
|
333
|
-
this.appendImplicitMenuItems(result);
|
|
334
|
-
}
|
|
335
|
-
|
|
336
|
-
if (this._menuExtendInfo.has(id)) {
|
|
337
|
-
return this.convertToMenuExtendInfo(this._menuExtendInfo.get(id)!, result);
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
return result;
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
getMenuCommand(command: string | MenuCommandDesc) {
|
|
344
|
-
if (typeof command === 'string') {
|
|
345
|
-
return { id: command };
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
return command;
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
private appendImplicitMenuItems(result: Array<IMenuItem | ISubmenuItem | IComponentMenuItem>) {
|
|
352
|
-
// 只保留 MenuItem
|
|
353
|
-
const temp = result.filter((item) => isIMenuItem(item)) as IMenuItem[];
|
|
354
|
-
const set = new Set<string>(temp.map((n) => this.getMenuCommand(n.command).id));
|
|
355
|
-
|
|
356
|
-
const allCommands = this.commandRegistry.getCommands();
|
|
357
|
-
// 将 commandRegistry 中 "其他" command 加进去
|
|
358
|
-
allCommands.forEach((command) => {
|
|
359
|
-
if (!set.has(command.id)) {
|
|
360
|
-
result.push({ command: command.id });
|
|
361
|
-
}
|
|
362
|
-
});
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
private convertToMenuExtendInfo(
|
|
366
|
-
extendInfoArr: ISumiMenuExtendInfo[],
|
|
367
|
-
result: Array<IMenuItem | ISubmenuItem | IComponentMenuItem>,
|
|
368
|
-
) {
|
|
369
|
-
return result.map((menuItem) => {
|
|
370
|
-
if (!isIMenuItem(menuItem)) {
|
|
371
|
-
return menuItem;
|
|
372
|
-
}
|
|
373
|
-
|
|
374
|
-
const { command } = menuItem;
|
|
375
|
-
const info = extendInfoArr.find((item) => item.command === command);
|
|
376
|
-
|
|
377
|
-
return info ? { ...menuItem, ...info } : menuItem;
|
|
378
|
-
});
|
|
379
|
-
}
|
|
380
|
-
}
|
|
381
|
-
|
|
382
|
-
@Injectable()
|
|
383
|
-
export class MenuRegistryImpl extends CoreMenuRegistryImpl {
|
|
384
|
-
@Autowired(MenuContribution)
|
|
385
|
-
protected readonly contributions: ContributionProvider<MenuContribution>;
|
|
386
|
-
|
|
387
|
-
// MenuContribution
|
|
388
|
-
initialize() {
|
|
389
|
-
for (const contrib of this.contributions.getContributions()) {
|
|
390
|
-
if (contrib.registerNextMenus) {
|
|
391
|
-
contrib.registerNextMenus(this);
|
|
392
|
-
warning(false, '`registerNextMenus` was deprecated in favor of `registerMenus`');
|
|
393
|
-
}
|
|
394
|
-
contrib.registerMenus && contrib.registerMenus(this);
|
|
395
|
-
}
|
|
396
|
-
}
|
|
397
|
-
}
|
|
398
|
-
|
|
399
|
-
export function isIMenuItem(item: IMenuItem | ISubmenuItem | IInternalComponentMenuItem): item is IMenuItem {
|
|
400
|
-
return (item as IMenuItem).command !== undefined;
|
|
401
|
-
}
|
|
402
|
-
|
|
403
|
-
export function isISubmenuItem(item: IMenuItem | ISubmenuItem | IInternalComponentMenuItem): item is ISubmenuItem {
|
|
404
|
-
return (item as ISubmenuItem).submenu !== undefined;
|
|
405
|
-
}
|
|
406
|
-
|
|
407
|
-
export function isIComponentMenuItem(
|
|
408
|
-
item: IMenuItem | ISubmenuItem | IInternalComponentMenuItem,
|
|
409
|
-
): item is IInternalComponentMenuItem {
|
|
410
|
-
return ReactIs.isValidElementType((item as IInternalComponentMenuItem).component);
|
|
411
|
-
}
|
|
412
|
-
|
|
413
|
-
/**
|
|
414
|
-
* 这里的 MenuAction 的展示类型拓展为支持 Button 组件的类型以及 checkbox
|
|
415
|
-
* 由于 Comment 模块的默认用的 Menu 的展示类型为 Button 类型
|
|
416
|
-
* 同时从设计角度更完善的展示 checked 属性,额外拓展了 checkbox 类型
|
|
417
|
-
* 用在 button 类型时 checked 状态的展示
|
|
418
|
-
*/
|
|
419
|
-
export type IMenuActionDisplayType = ButtonType | 'checkbox';
|
|
420
|
-
|
|
421
|
-
export interface IMenuAction {
|
|
422
|
-
/**
|
|
423
|
-
* command id
|
|
424
|
-
*/
|
|
425
|
-
readonly id: string;
|
|
426
|
-
label: string;
|
|
427
|
-
/**
|
|
428
|
-
* 标准的 vscode icon 是分两种主题的
|
|
429
|
-
*/
|
|
430
|
-
icon?: string;
|
|
431
|
-
tooltip?: string;
|
|
432
|
-
className?: string;
|
|
433
|
-
/**
|
|
434
|
-
* 快捷键描述
|
|
435
|
-
*/
|
|
436
|
-
keybinding?: string;
|
|
437
|
-
rawKeybinding?: string;
|
|
438
|
-
/**
|
|
439
|
-
* 是否为组合键
|
|
440
|
-
*/
|
|
441
|
-
isKeyCombination?: boolean;
|
|
442
|
-
/**
|
|
443
|
-
* disable 状态的 menu
|
|
444
|
-
*/
|
|
445
|
-
disabled?: boolean;
|
|
446
|
-
/**
|
|
447
|
-
* checked 状态 通过 toggledWhen 实现
|
|
448
|
-
*/
|
|
449
|
-
checked?: boolean;
|
|
450
|
-
/**
|
|
451
|
-
* electron menu 使用
|
|
452
|
-
*/
|
|
453
|
-
nativeRole?: string;
|
|
454
|
-
execute?: (...args: any[]) => any;
|
|
455
|
-
/**
|
|
456
|
-
* 默认值为 'icon'
|
|
457
|
-
*/
|
|
458
|
-
type?: IMenuActionDisplayType;
|
|
459
|
-
/**
|
|
460
|
-
* menu 子项最右侧的额外描述信息
|
|
461
|
-
*/
|
|
462
|
-
extraDesc?: string;
|
|
463
|
-
}
|
|
464
|
-
|
|
465
|
-
/**
|
|
466
|
-
* base 类
|
|
467
|
-
*/
|
|
468
|
-
export class MenuNode implements IMenuAction {
|
|
469
|
-
readonly id: string;
|
|
470
|
-
label: string;
|
|
471
|
-
icon?: string;
|
|
472
|
-
tooltip?: string;
|
|
473
|
-
className?: string;
|
|
474
|
-
keybinding: string;
|
|
475
|
-
rawKeybinding: string;
|
|
476
|
-
isKeyCombination: boolean;
|
|
477
|
-
disabled: boolean;
|
|
478
|
-
checked: boolean;
|
|
479
|
-
nativeRole: string;
|
|
480
|
-
extraDesc: string;
|
|
481
|
-
children: MenuNode[];
|
|
482
|
-
type?: IMenuActionDisplayType;
|
|
483
|
-
protected _actionCallback?: (...args: any[]) => any;
|
|
484
|
-
|
|
485
|
-
constructor(props: IMenuAction) {
|
|
486
|
-
this.id = props.id;
|
|
487
|
-
this.label = replaceLocalizePlaceholder(props.label)!;
|
|
488
|
-
this.className = props.className || '';
|
|
489
|
-
this.icon = props.icon || '';
|
|
490
|
-
this.keybinding = props.keybinding || '';
|
|
491
|
-
this.rawKeybinding = props.rawKeybinding || '';
|
|
492
|
-
this.isKeyCombination = Boolean(props.isKeyCombination);
|
|
493
|
-
this.disabled = Boolean(props.disabled);
|
|
494
|
-
this.checked = Boolean(props.checked);
|
|
495
|
-
this.nativeRole = props.nativeRole || '';
|
|
496
|
-
this.type = props.type;
|
|
497
|
-
this.extraDesc = props.extraDesc || '';
|
|
498
|
-
this._actionCallback = props.execute;
|
|
499
|
-
}
|
|
500
|
-
|
|
501
|
-
getExecuteArgs(...args: any[]): any[] {
|
|
502
|
-
return args;
|
|
503
|
-
}
|
|
504
|
-
|
|
505
|
-
execute(...args: any[]): any {
|
|
506
|
-
const runArgs = this.getExecuteArgs(args);
|
|
507
|
-
if (this._actionCallback) {
|
|
508
|
-
return this._actionCallback(...runArgs);
|
|
509
|
-
}
|
|
510
|
-
|
|
511
|
-
return Promise.resolve(true);
|
|
512
|
-
}
|
|
513
|
-
}
|
|
@@ -1,188 +0,0 @@
|
|
|
1
|
-
import { Autowired, Injectable, Optional, INJECTOR_TOKEN, Injector } from '@opensumi/di';
|
|
2
|
-
import { IDisposable, Disposable, Event, Emitter } from '@opensumi/ide-core-common';
|
|
3
|
-
|
|
4
|
-
import { IContextKeyService } from '../../context-key';
|
|
5
|
-
|
|
6
|
-
import { MenuNode } from './base';
|
|
7
|
-
import { generateMergedCtxMenu, generateCtxMenu, mergeTupleMenuNodeResult } from './menu-util';
|
|
8
|
-
import {
|
|
9
|
-
AbstractMenuService,
|
|
10
|
-
AbstractContextMenuService,
|
|
11
|
-
IContextMenu,
|
|
12
|
-
IMenu,
|
|
13
|
-
IMenuConfig,
|
|
14
|
-
SubmenuItemNode,
|
|
15
|
-
TupleMenuNodeResult,
|
|
16
|
-
CreateMenuPayload,
|
|
17
|
-
} from './menu.interface';
|
|
18
|
-
|
|
19
|
-
@Injectable()
|
|
20
|
-
export class ContextMenuServiceImpl implements AbstractContextMenuService {
|
|
21
|
-
@Autowired(INJECTOR_TOKEN)
|
|
22
|
-
private readonly injector: Injector;
|
|
23
|
-
|
|
24
|
-
public createMenu(payload: CreateMenuPayload): IContextMenu {
|
|
25
|
-
return this.injector.get(ContextMenu, [payload]);
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
@Injectable()
|
|
30
|
-
export class ContextMenu extends Disposable implements IContextMenu {
|
|
31
|
-
@Autowired(AbstractMenuService)
|
|
32
|
-
private readonly menuService: AbstractMenuService;
|
|
33
|
-
|
|
34
|
-
private readonly _onDidMenuChange = new Emitter<string>();
|
|
35
|
-
public get onDidChange(): Event<string> {
|
|
36
|
-
return this._onDidMenuChange.event;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
private readonly _onMenuChange = new Emitter<string>();
|
|
40
|
-
// internal 的 MenuChange 监听器,监听 menu/submenu 的变化
|
|
41
|
-
private get onMenuChange(): Event<string | undefined> {
|
|
42
|
-
return this._onMenuChange.event;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
private _menus: Map<string, IMenu> = new Map();
|
|
46
|
-
private _menuItems: TupleMenuNodeResult = [[], []];
|
|
47
|
-
|
|
48
|
-
private _menusListener: Map<string, IDisposable> = new Map();
|
|
49
|
-
private _menuId: string;
|
|
50
|
-
|
|
51
|
-
private readonly config: IMenuConfig;
|
|
52
|
-
private readonly contextKeyService: IContextKeyService;
|
|
53
|
-
|
|
54
|
-
public get menuId() {
|
|
55
|
-
return this._menuId;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
constructor(@Optional() payload: CreateMenuPayload) {
|
|
59
|
-
super();
|
|
60
|
-
this._menuId = payload.id;
|
|
61
|
-
if (payload.config) {
|
|
62
|
-
this.config = payload.config;
|
|
63
|
-
}
|
|
64
|
-
if (payload.contextKeyService) {
|
|
65
|
-
this.contextKeyService = payload.contextKeyService;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
this._build();
|
|
69
|
-
|
|
70
|
-
// 监听内部的 onMenuChange 刷新单个 menu 下的所有节点
|
|
71
|
-
this.addDispose(
|
|
72
|
-
Event.debounce(
|
|
73
|
-
Event.filter(this.onMenuChange, (menuId) => menuId === this._menuId),
|
|
74
|
-
() => {},
|
|
75
|
-
50,
|
|
76
|
-
)(this._rebuildMenus, this),
|
|
77
|
-
);
|
|
78
|
-
|
|
79
|
-
this.addDispose(this._onDidMenuChange);
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
// 构建完整的 menuItems
|
|
83
|
-
private _build() {
|
|
84
|
-
// reset
|
|
85
|
-
this._menuItems = [[], []];
|
|
86
|
-
this._buildMenus(this._menuId);
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
// 根据事件监听结果更新
|
|
90
|
-
private _rebuildMenus() {
|
|
91
|
-
this._buildMenus(this._menuId);
|
|
92
|
-
this._onDidMenuChange.fire(this._menuId);
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
/**
|
|
96
|
-
* 构建产生每个 submenu item 下方点击展开的 menus
|
|
97
|
-
* 包括递归产生多层级结构
|
|
98
|
-
* @param menuId [string]
|
|
99
|
-
*/
|
|
100
|
-
private _buildMenus(menuId: string) {
|
|
101
|
-
const menus = this.menuService.createMenu(menuId, this.contextKeyService);
|
|
102
|
-
|
|
103
|
-
// clean up for IMenu
|
|
104
|
-
const oldMenus = this._menus.get(menuId);
|
|
105
|
-
if (oldMenus) {
|
|
106
|
-
oldMenus.dispose();
|
|
107
|
-
this._menus.delete(menuId);
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
// clean up for menu.onDidChange
|
|
111
|
-
const oldMenusListener = this._menusListener.get(menuId);
|
|
112
|
-
if (oldMenusListener) {
|
|
113
|
-
oldMenusListener.dispose();
|
|
114
|
-
this._menusListener.delete(menuId);
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
this._menus.set(menuId, menus);
|
|
118
|
-
this._menusListener.set(
|
|
119
|
-
menuId,
|
|
120
|
-
menus.onDidChange(() => this._onMenuChange.fire(menuId), this, this.disposables),
|
|
121
|
-
);
|
|
122
|
-
|
|
123
|
-
// 顶层结果最后会通过 navigation/inline 等分隔符分割,所以维持原结构
|
|
124
|
-
const menuNodes = [[], []] as TupleMenuNodeResult;
|
|
125
|
-
const tupleMenuNodeResult = generateCtxMenu({ menus, ...this.config });
|
|
126
|
-
tupleMenuNodeResult.forEach((menuItems, index) => {
|
|
127
|
-
this._traverseMenuItems(menuItems, menuNodes[index], menuId);
|
|
128
|
-
});
|
|
129
|
-
|
|
130
|
-
this._menuItems = menuNodes;
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
/**
|
|
134
|
-
* 递归构建生成单个 Menu 下所有层级菜单的数据结构的函数
|
|
135
|
-
* @param menus IMenu 实例, menuService.createMenu 返回值
|
|
136
|
-
* @param menuToPopulate 递归中用来收集数结果
|
|
137
|
-
* @param rootMenuId 顶级的 menuId, 下方所有 submenuId 的 onDidChange 都触发顶层 menuId 事件以刷新该 menuId 下所有的数据
|
|
138
|
-
*/
|
|
139
|
-
private _traverseMenuItems(menuItems: MenuNode[], menuToPopulate: MenuNode[], rootMenuId: string) {
|
|
140
|
-
menuItems.forEach((menuItem) => {
|
|
141
|
-
if (menuItem instanceof SubmenuItemNode) {
|
|
142
|
-
const submenuItems = [] as MenuNode[];
|
|
143
|
-
|
|
144
|
-
const submenuId = menuItem.item.submenu;
|
|
145
|
-
if (!this._menus.has(submenuId)) {
|
|
146
|
-
const menus = this.registerDispose(this.menuService.createMenu(submenuId, this.contextKeyService));
|
|
147
|
-
this._menus.set(submenuId, menus);
|
|
148
|
-
this.registerDispose(
|
|
149
|
-
menus.onDidChange(() => {
|
|
150
|
-
// 通知外部 顶层 menuId 下所有结构变了, 需要重新生成数据结构
|
|
151
|
-
this._onMenuChange.fire(rootMenuId);
|
|
152
|
-
}),
|
|
153
|
-
);
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
const menuToDispose = this.menuService.createMenu(submenuId, this.contextKeyService);
|
|
157
|
-
const menuNodes = generateMergedCtxMenu({ menus: menuToDispose, ...this.config });
|
|
158
|
-
this._traverseMenuItems(menuNodes, submenuItems, rootMenuId);
|
|
159
|
-
|
|
160
|
-
// 挂载 submenu 下的子级 menuItems
|
|
161
|
-
menuItem.children = submenuItems;
|
|
162
|
-
|
|
163
|
-
menuToPopulate.push(menuItem);
|
|
164
|
-
menuToDispose.dispose();
|
|
165
|
-
} else {
|
|
166
|
-
menuToPopulate.push(menuItem);
|
|
167
|
-
}
|
|
168
|
-
});
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
public dispose() {
|
|
172
|
-
this._menusListener.forEach((disposable) => disposable.dispose());
|
|
173
|
-
this._menusListener.clear();
|
|
174
|
-
this._menus.forEach((menu) => menu.dispose());
|
|
175
|
-
this._menus.clear();
|
|
176
|
-
super.dispose();
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
// 获得已分好组并合并的 MenuNodes 列表
|
|
180
|
-
public getMergedMenuNodes() {
|
|
181
|
-
return mergeTupleMenuNodeResult(this._menuItems);
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
// 获得已分好组的 MenuNodes 列表
|
|
185
|
-
public getGroupedMenuNodes() {
|
|
186
|
-
return this._menuItems;
|
|
187
|
-
}
|
|
188
|
-
}
|
package/src/menu/next/index.ts
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
export * from './base';
|
|
2
|
-
export * from './menu-service';
|
|
3
|
-
export * from './menu-util';
|
|
4
|
-
export * from './menu-id';
|
|
5
|
-
export * from './menu.interface';
|
|
6
|
-
export * from './menu.contrib.interface';
|
|
7
|
-
export * from './renderer/ctxmenu/base';
|
|
8
|
-
export * from './menubar-service';
|
|
9
|
-
export * from './ctxmenu-service';
|
|
10
|
-
export * from './toolbar-action.service';
|