@theia/core 1.59.0-next.62 → 1.59.0

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.
Files changed (125) hide show
  1. package/README.md +6 -6
  2. package/i18n/nls.cs.json +344 -23
  3. package/i18n/nls.de.json +344 -23
  4. package/i18n/nls.es.json +344 -23
  5. package/i18n/nls.fr.json +344 -23
  6. package/i18n/nls.hu.json +344 -23
  7. package/i18n/nls.it.json +344 -23
  8. package/i18n/nls.ja.json +344 -23
  9. package/i18n/nls.json +344 -23
  10. package/i18n/nls.ko.json +344 -23
  11. package/i18n/nls.pl.json +344 -23
  12. package/i18n/nls.pt-br.json +344 -23
  13. package/i18n/nls.ru.json +344 -23
  14. package/i18n/nls.tr.json +344 -23
  15. package/i18n/nls.zh-cn.json +344 -23
  16. package/i18n/nls.zh-tw.json +344 -23
  17. package/lib/browser/about-dialog.js +1 -1
  18. package/lib/browser/about-dialog.js.map +1 -1
  19. package/lib/browser/catalog.json +65 -5
  20. package/lib/browser/common-frontend-contribution.d.ts +2 -0
  21. package/lib/browser/common-frontend-contribution.d.ts.map +1 -1
  22. package/lib/browser/common-frontend-contribution.js +32 -0
  23. package/lib/browser/common-frontend-contribution.js.map +1 -1
  24. package/lib/browser/context-menu-renderer.d.ts +3 -3
  25. package/lib/browser/context-menu-renderer.d.ts.map +1 -1
  26. package/lib/browser/core-preferences.js +5 -5
  27. package/lib/browser/core-preferences.js.map +1 -1
  28. package/lib/browser/menu/browser-menu-plugin.d.ts +7 -0
  29. package/lib/browser/menu/browser-menu-plugin.d.ts.map +1 -1
  30. package/lib/browser/menu/browser-menu-plugin.js +46 -3
  31. package/lib/browser/menu/browser-menu-plugin.js.map +1 -1
  32. package/lib/browser/navigatable-types.d.ts.map +1 -1
  33. package/lib/browser/navigatable-types.js +1 -1
  34. package/lib/browser/navigatable-types.js.map +1 -1
  35. package/lib/browser/preload/i18n-preload-contribution.d.ts +4 -0
  36. package/lib/browser/preload/i18n-preload-contribution.d.ts.map +1 -1
  37. package/lib/browser/preload/i18n-preload-contribution.js +23 -1
  38. package/lib/browser/preload/i18n-preload-contribution.js.map +1 -1
  39. package/lib/browser/preload/preload-module.d.ts.map +1 -1
  40. package/lib/browser/preload/preload-module.js +5 -3
  41. package/lib/browser/preload/preload-module.js.map +1 -1
  42. package/lib/browser/preload/text-replacement-contribution.d.ts +37 -0
  43. package/lib/browser/preload/text-replacement-contribution.d.ts.map +1 -0
  44. package/lib/browser/preload/text-replacement-contribution.js +20 -0
  45. package/lib/browser/preload/text-replacement-contribution.js.map +1 -0
  46. package/lib/browser/shell/side-panel-handler.d.ts.map +1 -1
  47. package/lib/browser/shell/side-panel-handler.js +2 -1
  48. package/lib/browser/shell/side-panel-handler.js.map +1 -1
  49. package/lib/browser/shell/sidebar-bottom-menu-widget.d.ts.map +1 -1
  50. package/lib/browser/shell/sidebar-bottom-menu-widget.js +2 -1
  51. package/lib/browser/shell/sidebar-bottom-menu-widget.js.map +1 -1
  52. package/lib/browser/shell/sidebar-menu-widget.d.ts.map +1 -1
  53. package/lib/browser/shell/sidebar-menu-widget.js +1 -0
  54. package/lib/browser/shell/sidebar-menu-widget.js.map +1 -1
  55. package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar.js +2 -2
  56. package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar.js.map +1 -1
  57. package/lib/browser/shell/tab-bars.d.ts.map +1 -1
  58. package/lib/browser/shell/tab-bars.js +1 -0
  59. package/lib/browser/shell/tab-bars.js.map +1 -1
  60. package/lib/browser/tree/tree-widget.d.ts.map +1 -1
  61. package/lib/browser/tree/tree-widget.js +1 -0
  62. package/lib/browser/tree/tree-widget.js.map +1 -1
  63. package/lib/browser/view-container.d.ts.map +1 -1
  64. package/lib/browser/view-container.js +6 -2
  65. package/lib/browser/view-container.js.map +1 -1
  66. package/lib/browser/widgets/widget.d.ts.map +1 -1
  67. package/lib/browser/widgets/widget.js +4 -2
  68. package/lib/browser/widgets/widget.js.map +1 -1
  69. package/lib/common/array-utils.d.ts +2 -0
  70. package/lib/common/array-utils.d.ts.map +1 -1
  71. package/lib/common/array-utils.js +24 -0
  72. package/lib/common/array-utils.js.map +1 -1
  73. package/lib/common/content-replacer.d.ts +56 -0
  74. package/lib/common/content-replacer.d.ts.map +1 -0
  75. package/lib/common/content-replacer.js +139 -0
  76. package/lib/common/content-replacer.js.map +1 -0
  77. package/lib/common/content-replacer.spec.d.ts +2 -0
  78. package/lib/common/content-replacer.spec.d.ts.map +1 -0
  79. package/lib/common/content-replacer.spec.js +115 -0
  80. package/lib/common/content-replacer.spec.js.map +1 -0
  81. package/lib/common/i18n/localization.d.ts +2 -3
  82. package/lib/common/i18n/localization.d.ts.map +1 -1
  83. package/lib/common/i18n/localization.js +10 -3
  84. package/lib/common/i18n/localization.js.map +1 -1
  85. package/lib/common/menu/composite-menu-node.d.ts +2 -2
  86. package/lib/common/menu/composite-menu-node.d.ts.map +1 -1
  87. package/lib/common/menu/composite-menu-node.js +2 -0
  88. package/lib/common/menu/composite-menu-node.js.map +1 -1
  89. package/lib/common/menu/menu-model-registry.d.ts +22 -4
  90. package/lib/common/menu/menu-model-registry.d.ts.map +1 -1
  91. package/lib/common/menu/menu-model-registry.js +74 -17
  92. package/lib/common/menu/menu-model-registry.js.map +1 -1
  93. package/lib/common/menu/menu-types.d.ts +2 -1
  94. package/lib/common/menu/menu-types.d.ts.map +1 -1
  95. package/lib/common/menu/menu-types.js.map +1 -1
  96. package/lib/electron-browser/menu/electron-context-menu-renderer.d.ts.map +1 -1
  97. package/lib/electron-browser/menu/electron-context-menu-renderer.js +3 -1
  98. package/lib/electron-browser/menu/electron-context-menu-renderer.js.map +1 -1
  99. package/package.json +6 -6
  100. package/src/browser/about-dialog.tsx +1 -1
  101. package/src/browser/common-frontend-contribution.ts +30 -0
  102. package/src/browser/context-menu-renderer.ts +3 -3
  103. package/src/browser/core-preferences.ts +5 -5
  104. package/src/browser/menu/browser-menu-plugin.ts +55 -5
  105. package/src/browser/navigatable-types.ts +1 -1
  106. package/src/browser/preload/i18n-preload-contribution.ts +22 -2
  107. package/src/browser/preload/preload-module.ts +5 -3
  108. package/src/browser/preload/text-replacement-contribution.ts +53 -0
  109. package/src/browser/shell/side-panel-handler.ts +2 -1
  110. package/src/browser/shell/sidebar-bottom-menu-widget.tsx +2 -1
  111. package/src/browser/shell/sidebar-menu-widget.tsx +1 -0
  112. package/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar.tsx +2 -2
  113. package/src/browser/shell/tab-bars.ts +1 -0
  114. package/src/browser/tree/tree-widget.tsx +1 -0
  115. package/src/browser/view-container.ts +6 -2
  116. package/src/browser/widgets/widget.ts +4 -2
  117. package/src/common/array-utils.ts +25 -0
  118. package/src/common/content-replacer.spec.ts +124 -0
  119. package/src/common/content-replacer.ts +151 -0
  120. package/src/common/i18n/localization.ts +10 -4
  121. package/src/common/i18n/nls.metadata.json +34921 -32708
  122. package/src/common/menu/composite-menu-node.ts +4 -2
  123. package/src/common/menu/menu-model-registry.ts +84 -19
  124. package/src/common/menu/menu-types.ts +2 -1
  125. package/src/electron-browser/menu/electron-context-menu-renderer.ts +3 -1
@@ -54,11 +54,13 @@ export class CompositeMenuNode implements MutableCompoundMenuNode {
54
54
  };
55
55
  }
56
56
 
57
- removeNode(id: string): void {
57
+ removeNode(id: string): boolean {
58
58
  const idx = this._children.findIndex(n => n.id === id);
59
59
  if (idx >= 0) {
60
60
  this._children.splice(idx, 1);
61
+ return true;
61
62
  }
63
+ return false;
62
64
  }
63
65
 
64
66
  updateOptions(options?: SubMenuOptions): void {
@@ -108,7 +110,7 @@ export class CompositeMenuNodeWrapper implements MutableCompoundMenuNode {
108
110
 
109
111
  addNode(node: MenuNode): Disposable { return this.wrapped.addNode(node); }
110
112
 
111
- removeNode(id: string): void { return this.wrapped.removeNode(id); }
113
+ removeNode(id: string): boolean { return this.wrapped.removeNode(id); }
112
114
 
113
115
  updateOptions(options: SubMenuOptions): void { return this.wrapped.updateOptions(options); }
114
116
  }
@@ -59,6 +59,29 @@ export interface MenuContribution {
59
59
  registerMenus(menus: MenuModelRegistry): void;
60
60
  }
61
61
 
62
+ export enum ChangeKind {
63
+ ADDED,
64
+ REMOVED,
65
+ CHANGED,
66
+ LINKED
67
+ }
68
+
69
+ export interface MenuChangedEvent {
70
+ kind: ChangeKind;
71
+ path: MenuPath
72
+ }
73
+
74
+ export interface StructuralMenuChange extends MenuChangedEvent {
75
+ kind: ChangeKind.ADDED | ChangeKind.REMOVED | ChangeKind.LINKED;
76
+ affectedChildId: string
77
+ }
78
+
79
+ export namespace StructuralMenuChange {
80
+ export function is(evt: MenuChangedEvent): evt is StructuralMenuChange {
81
+ return evt.kind !== ChangeKind.CHANGED;
82
+ }
83
+ }
84
+
62
85
  /**
63
86
  * The MenuModelRegistry allows to register and unregister menus, submenus and actions
64
87
  * via strings and {@link MenuAction}s without the need to access the underlying UI
@@ -69,9 +92,9 @@ export class MenuModelRegistry {
69
92
  protected readonly root = new CompositeMenuNode('');
70
93
  protected readonly independentSubmenus = new Map<string, MutableCompoundMenuNode>();
71
94
 
72
- protected readonly onDidChangeEmitter = new Emitter<void>();
95
+ protected readonly onDidChangeEmitter = new Emitter<MenuChangedEvent>();
73
96
 
74
- get onDidChange(): Event<void> {
97
+ get onDidChange(): Event<MenuChangedEvent> {
75
98
  return this.onDidChangeEmitter.event;
76
99
  }
77
100
 
@@ -108,8 +131,21 @@ export class MenuModelRegistry {
108
131
  registerMenuNode(menuPath: MenuPath | string, menuNode: MenuNode, group?: string): Disposable {
109
132
  const parent = this.getMenuNode(menuPath, group);
110
133
  const disposable = parent.addNode(menuNode);
111
- this.fireChangeEvent();
112
- return this.changeEventOnDispose(disposable);
134
+ const parentPath = this.getParentPath(menuPath, group);
135
+ this.fireChangeEvent({
136
+ kind: ChangeKind.ADDED,
137
+ path: parentPath,
138
+ affectedChildId: menuNode.id
139
+ });
140
+ return this.changeEventOnDispose(parentPath, menuNode.id, disposable);
141
+ }
142
+
143
+ protected getParentPath(menuPath: MenuPath | string, group?: string): string[] {
144
+ if (typeof menuPath === 'string') {
145
+ return group ? [menuPath, group] : [menuPath];
146
+ } else {
147
+ return group ? menuPath.concat(group) : menuPath;
148
+ }
113
149
  }
114
150
 
115
151
  getMenuNode(menuPath: MenuPath | string, group?: string): MutableCompoundMenuNode {
@@ -152,11 +188,19 @@ export class MenuModelRegistry {
152
188
  let disposable = Disposable.NULL;
153
189
  if (!groupNode) {
154
190
  groupNode = new CompositeMenuNode(menuId, label, options, parent);
155
- disposable = this.changeEventOnDispose(parent.addNode(groupNode));
191
+ disposable = this.changeEventOnDispose(groupPath, menuId, parent.addNode(groupNode));
192
+ this.fireChangeEvent({
193
+ kind: ChangeKind.ADDED,
194
+ path: groupPath,
195
+ affectedChildId: menuId
196
+ });
156
197
  } else {
198
+ this.fireChangeEvent({
199
+ kind: ChangeKind.CHANGED,
200
+ path: groupPath,
201
+ });
157
202
  groupNode.updateOptions({ ...options, label });
158
203
  }
159
- this.fireChangeEvent();
160
204
  return disposable;
161
205
  }
162
206
 
@@ -165,12 +209,13 @@ export class MenuModelRegistry {
165
209
  console.debug(`Independent submenu with path ${id} registered, but given ID already exists.`);
166
210
  }
167
211
  this.independentSubmenus.set(id, new CompositeMenuNode(id, label, options));
168
- return this.changeEventOnDispose(Disposable.create(() => this.independentSubmenus.delete(id)));
212
+ return this.changeEventOnDispose([], id, Disposable.create(() => this.independentSubmenus.delete(id)));
169
213
  }
170
214
 
171
215
  linkSubmenu(parentPath: MenuPath | string, childId: string | MenuPath, options?: SubMenuOptions, group?: string): Disposable {
172
216
  const child = this.getMenuNode(childId);
173
217
  const parent = this.getMenuNode(parentPath, group);
218
+ const affectedPath = this.getParentPath(parentPath, group);
174
219
 
175
220
  const isRecursive = (node: MenuNodeMetadata, childNode: MenuNodeMetadata): boolean => {
176
221
  if (node.id === childNode.id) {
@@ -190,8 +235,13 @@ export class MenuModelRegistry {
190
235
 
191
236
  const wrapper = new CompositeMenuNodeWrapper(child, parent, options);
192
237
  const disposable = parent.addNode(wrapper);
193
- this.fireChangeEvent();
194
- return this.changeEventOnDispose(disposable);
238
+ this.fireChangeEvent({
239
+ kind: ChangeKind.LINKED,
240
+ path: affectedPath,
241
+ affectedChildId: child.id
242
+
243
+ });
244
+ return this.changeEventOnDispose(affectedPath, child.id, disposable);
195
245
  }
196
246
 
197
247
  /**
@@ -223,11 +273,14 @@ export class MenuModelRegistry {
223
273
  if (menuPath) {
224
274
  const parent = this.findGroup(menuPath);
225
275
  parent.removeNode(id);
226
- this.fireChangeEvent();
227
- return;
276
+ this.fireChangeEvent({
277
+ kind: ChangeKind.REMOVED,
278
+ path: menuPath,
279
+ affectedChildId: id
280
+ });
281
+ } else {
282
+ this.unregisterMenuNode(id);
228
283
  }
229
-
230
- this.unregisterMenuNode(id);
231
284
  }
232
285
 
233
286
  /**
@@ -236,16 +289,24 @@ export class MenuModelRegistry {
236
289
  * @param id technical identifier of the `MenuNode`.
237
290
  */
238
291
  unregisterMenuNode(id: string): void {
292
+ const parentPath: string[] = [];
239
293
  const recurse = (root: MutableCompoundMenuNode) => {
240
294
  root.children.forEach(node => {
241
295
  if (CompoundMenuNode.isMutable(node)) {
242
- node.removeNode(id);
296
+ if (node.removeNode(id)) {
297
+ this.fireChangeEvent({
298
+ kind: ChangeKind.REMOVED,
299
+ path: parentPath,
300
+ affectedChildId: id
301
+ });
302
+ }
303
+ parentPath.push(node.id);
243
304
  recurse(node);
305
+ parentPath.pop();
244
306
  }
245
307
  });
246
308
  };
247
309
  recurse(this.root);
248
- this.fireChangeEvent();
249
310
  }
250
311
 
251
312
  /**
@@ -339,16 +400,20 @@ export class MenuModelRegistry {
339
400
  return true;
340
401
  }
341
402
 
342
- protected changeEventOnDispose(disposable: Disposable): Disposable {
403
+ protected changeEventOnDispose(path: MenuPath, id: string, disposable: Disposable): Disposable {
343
404
  return Disposable.create(() => {
344
405
  disposable.dispose();
345
- this.fireChangeEvent();
406
+ this.fireChangeEvent({
407
+ path,
408
+ affectedChildId: id,
409
+ kind: ChangeKind.REMOVED
410
+ });
346
411
  });
347
412
  }
348
413
 
349
- protected fireChangeEvent(): void {
414
+ protected fireChangeEvent<T extends MenuChangedEvent>(evt: T): void {
350
415
  if (this.isReady) {
351
- this.onDidChangeEmitter.fire();
416
+ this.onDidChangeEmitter.fire(evt);
352
417
  }
353
418
  }
354
419
 
@@ -139,8 +139,9 @@ export interface MutableCompoundMenuNode extends CompoundMenuNode {
139
139
  * Removes the first node with the given id.
140
140
  *
141
141
  * @param id node id.
142
+ * @returns true if the id was present
142
143
  */
143
- removeNode(id: string): void;
144
+ removeNode(id: string): boolean;
144
145
 
145
146
  /**
146
147
  * Fills any `undefined` fields with the values from the {@link options}.
@@ -56,6 +56,7 @@ export class ElectronTextInputContextMenuContribution implements FrontendApplica
56
56
  this.contextMenuRenderer.render({
57
57
  anchor: event,
58
58
  menuPath: ElectronTextInputContextMenu.MENU_PATH,
59
+ context: event.target,
59
60
  onHide: () => target.focus()
60
61
  });
61
62
  }
@@ -119,7 +120,8 @@ export class ElectronContextMenuRenderer extends BrowserContextMenuRenderer {
119
120
  const node = (menuAccess as BrowserContextMenuAccess).menu.node;
120
121
  const topPanelHeight = document.getElementById('theia-top-panel')?.clientHeight ?? 0;
121
122
  // ensure the context menu is not displayed outside of the main area
122
- if (node.style.top && parseInt(node.style.top.substring(0, node.style.top.length - 2)) < topPanelHeight) {
123
+ const menuRect = node.getBoundingClientRect();
124
+ if (menuRect.top < topPanelHeight) {
123
125
  node.style.top = `${topPanelHeight}px`;
124
126
  node.style.maxHeight = `calc(${node.style.maxHeight} - ${topPanelHeight}px)`;
125
127
  }