@theia/terminal-manager 1.70.0-next.21 → 1.70.0-next.26

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 (30) hide show
  1. package/lib/browser/terminal-manager-frontend-contribution.d.ts +6 -0
  2. package/lib/browser/terminal-manager-frontend-contribution.d.ts.map +1 -1
  3. package/lib/browser/terminal-manager-frontend-contribution.js +13 -1
  4. package/lib/browser/terminal-manager-frontend-contribution.js.map +1 -1
  5. package/lib/browser/terminal-manager-tree-model.d.ts +10 -4
  6. package/lib/browser/terminal-manager-tree-model.d.ts.map +1 -1
  7. package/lib/browser/terminal-manager-tree-model.js +55 -9
  8. package/lib/browser/terminal-manager-tree-model.js.map +1 -1
  9. package/lib/browser/terminal-manager-tree-widget.d.ts.map +1 -1
  10. package/lib/browser/terminal-manager-tree-widget.js +6 -1
  11. package/lib/browser/terminal-manager-tree-widget.js.map +1 -1
  12. package/lib/browser/terminal-manager-types.d.ts +8 -0
  13. package/lib/browser/terminal-manager-types.d.ts.map +1 -1
  14. package/lib/browser/terminal-manager-types.js +10 -1
  15. package/lib/browser/terminal-manager-types.js.map +1 -1
  16. package/lib/browser/terminal-manager-types.spec.d.ts +2 -0
  17. package/lib/browser/terminal-manager-types.spec.d.ts.map +1 -0
  18. package/lib/browser/terminal-manager-types.spec.js +100 -0
  19. package/lib/browser/terminal-manager-types.spec.js.map +1 -0
  20. package/lib/browser/terminal-manager-widget.d.ts +4 -1
  21. package/lib/browser/terminal-manager-widget.d.ts.map +1 -1
  22. package/lib/browser/terminal-manager-widget.js +44 -8
  23. package/lib/browser/terminal-manager-widget.js.map +1 -1
  24. package/package.json +5 -5
  25. package/src/browser/terminal-manager-frontend-contribution.ts +13 -1
  26. package/src/browser/terminal-manager-tree-model.ts +63 -7
  27. package/src/browser/terminal-manager-tree-widget.tsx +7 -2
  28. package/src/browser/terminal-manager-types.spec.ts +107 -0
  29. package/src/browser/terminal-manager-types.ts +12 -0
  30. package/src/browser/terminal-manager-widget.ts +55 -12
@@ -32,7 +32,7 @@ import {
32
32
  Widget,
33
33
  WidgetManager,
34
34
  } from '@theia/core/lib/browser';
35
- import { Emitter, nls } from '@theia/core';
35
+ import { Disposable, DisposableCollection, Emitter, nls } from '@theia/core';
36
36
  import { UUID } from '@theia/core/shared/@lumino/coreutils';
37
37
  import { TerminalWidget, TerminalWidgetOptions } from '@theia/terminal/lib/browser/base/terminal-widget';
38
38
  import { TerminalWidgetImpl } from '@theia/terminal/lib/browser/terminal-widget-impl';
@@ -92,6 +92,8 @@ export class TerminalManagerWidget extends BaseWidget implements StatefulWidget,
92
92
  terminalWidgets = new Map<TerminalManagerTreeTypes.TerminalKey, TerminalWidget>();
93
93
  /** By terminal ID to work from widget to internal metadata. */
94
94
  terminalWidgetIdsToNodeIds = new Map<string, TerminalManagerTreeTypes.TerminalKey>();
95
+ /** Track disposables per terminal to prevent memory leaks. */
96
+ protected terminalDisposables = new Map<TerminalManagerTreeTypes.TerminalKey, DisposableCollection>();
95
97
 
96
98
  protected readonly onDidChangeTrackableWidgetsEmitter = new Emitter<Widget[]>();
97
99
  readonly onDidChangeTrackableWidgets = this.onDidChangeTrackableWidgetsEmitter.event;
@@ -299,7 +301,7 @@ export class TerminalManagerWidget extends BaseWidget implements StatefulWidget,
299
301
  groupPanel.addWidget(widget);
300
302
  const pagePanel = this.createPagePanel();
301
303
  pagePanel.addWidget(groupPanel);
302
- this.treeWidget.model.addTerminalPage(terminalKey, groupPanel.id, pagePanel.id);
304
+ this.treeWidget.model.addTerminalPage(terminalKey, groupPanel.id, pagePanel.id, widget.title.label);
303
305
  return pagePanel;
304
306
  }
305
307
  }
@@ -307,19 +309,44 @@ export class TerminalManagerWidget extends BaseWidget implements StatefulWidget,
307
309
  protected addTerminalReference(widget: TerminalWidget, nodeId: TerminalManagerTreeTypes.TerminalKey): void {
308
310
  this.terminalWidgets.set(nodeId, widget);
309
311
  this.terminalWidgetIdsToNodeIds.set(widget.id, nodeId);
312
+
313
+ // Create disposable collection for this terminal
314
+ const disposables = new DisposableCollection();
315
+
316
+ // Track title label changes with proper disposal
317
+ let currentLabel = widget.title.label;
318
+ const titleChangeHandler = () => {
319
+ if (widget.title.label !== currentLabel) {
320
+ currentLabel = widget.title.label;
321
+ this.treeWidget.model.updateTerminalLabel(nodeId, currentLabel);
322
+ }
323
+ };
324
+ widget.title.changed.connect(titleChangeHandler);
325
+ disposables.push(Disposable.create(() => widget.title.changed.disconnect(titleChangeHandler)));
326
+
327
+ this.terminalDisposables.set(nodeId, disposables);
310
328
  }
311
329
 
312
330
  protected removeTerminalReferenceByWidgetId(widgetId: string): boolean {
313
331
  const nodeId = this.terminalWidgetIdsToNodeIds.get(widgetId);
314
- if (nodeId === undefined) {return false; }
315
- return this.terminalWidgets.delete(nodeId);
332
+ if (nodeId === undefined) { return false; }
333
+ this.removeTerminalReferenceByNodeId(nodeId);
334
+ return true;
316
335
  }
317
336
 
318
337
  protected removeTerminalReferenceByNodeId(nodeId: TerminalManagerTreeTypes.TerminalKey): boolean {
319
338
  const widget = this.terminalWidgets.get(nodeId);
320
- if (!widget) {return false; }
339
+ if (!widget) { return false; }
321
340
  this.terminalWidgets.delete(nodeId);
322
341
  this.terminalWidgetIdsToNodeIds.delete(widget.id);
342
+
343
+ // Dispose signal connections
344
+ const disposables = this.terminalDisposables.get(nodeId);
345
+ if (disposables) {
346
+ disposables.dispose();
347
+ this.terminalDisposables.delete(nodeId);
348
+ }
349
+
323
350
  return true;
324
351
  }
325
352
 
@@ -359,11 +386,12 @@ export class TerminalManagerWidget extends BaseWidget implements StatefulWidget,
359
386
  }
360
387
 
361
388
  protected handlePageAdded(pageId: TerminalManagerTreeTypes.PageId): void {
362
- const pagePanel = this.pagePanels.get(pageId);
363
- if (pagePanel) {
364
- this.terminalPanelWrapper.addWidget(pagePanel);
365
- this.update();
389
+ let pagePanel = this.pagePanels.get(pageId);
390
+ if (!pagePanel) {
391
+ pagePanel = this.createPagePanel(pageId);
366
392
  }
393
+ this.terminalPanelWrapper.addWidget(pagePanel);
394
+ this.update();
367
395
  }
368
396
 
369
397
  protected handlePageDeleted(pagePanelId: TerminalManagerTreeTypes.PageId): void {
@@ -399,7 +427,7 @@ export class TerminalManagerWidget extends BaseWidget implements StatefulWidget,
399
427
  this.onDidChangeTrackableWidgetsEmitter.fire(this.getTrackableWidgets());
400
428
  const groupPanel = this.createTerminalGroupPanel();
401
429
  groupPanel.addWidget(widget);
402
- this.treeWidget.model.addTerminalGroup(terminalId, groupPanel.id, pageId);
430
+ this.treeWidget.model.addTerminalGroup(terminalId, groupPanel.id, pageId, widget.title.label);
403
431
  }
404
432
  }
405
433
 
@@ -466,7 +494,7 @@ export class TerminalManagerWidget extends BaseWidget implements StatefulWidget,
466
494
 
467
495
  protected clearTerminalReferences(panel: TerminalManagerTreeTypes.GroupSplitPanel): void {
468
496
  for (const terminal of panel.widgets) {
469
- this.removeTerminalReferenceByWidgetId(terminal.id);
497
+ this.removeTerminalReferenceByWidgetId(terminal.id);
470
498
  }
471
499
  }
472
500
 
@@ -475,7 +503,18 @@ export class TerminalManagerWidget extends BaseWidget implements StatefulWidget,
475
503
  const newTerminalId = TerminalManagerTreeTypes.generateTerminalKey(widget);
476
504
  this.addTerminalReference(widget, newTerminalId);
477
505
  this.onDidChangeTrackableWidgetsEmitter.fire(this.getTrackableWidgets());
478
- this.treeWidget.model.addTerminal(newTerminalId, groupId);
506
+ this.treeWidget.model.addTerminal(newTerminalId, groupId, widget.title.label);
507
+ }
508
+ }
509
+
510
+ addTerminalToTasksPage(widget: Widget): void {
511
+ if (widget instanceof TerminalWidgetImpl) {
512
+ const terminalKey = TerminalManagerTreeTypes.generateTerminalKey(widget);
513
+ this.addTerminalReference(widget, terminalKey);
514
+ this.onDidChangeTrackableWidgetsEmitter.fire(this.getTrackableWidgets());
515
+ const groupPanel = this.createTerminalGroupPanel();
516
+ groupPanel.addWidget(widget);
517
+ this.treeWidget.model.addTerminalToTasksPage(terminalKey, groupPanel.id, widget.title.label);
479
518
  }
480
519
  }
481
520
 
@@ -725,6 +764,10 @@ export class TerminalManagerWidget extends BaseWidget implements StatefulWidget,
725
764
  }
726
765
 
727
766
  override dispose(): void {
767
+ // Dispose all remaining signal connections
768
+ this.terminalDisposables.forEach(disposables => disposables.dispose());
769
+ this.terminalDisposables.clear();
770
+
728
771
  this.toDispose.dispose();
729
772
  super.dispose();
730
773
  this.terminalWidgets.clear();