dockview-core 1.7.3 → 1.7.4

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 (164) hide show
  1. package/dist/cjs/api/dockviewPanelApi.js +1 -1
  2. package/dist/cjs/api/dockviewPanelApi.js.map +1 -1
  3. package/dist/cjs/api/panelApi.d.ts.map +1 -1
  4. package/dist/cjs/api/panelApi.js +3 -5
  5. package/dist/cjs/api/panelApi.js.map +1 -1
  6. package/dist/cjs/dnd/abstractDragHandler.d.ts.map +1 -1
  7. package/dist/cjs/dnd/abstractDragHandler.js +1 -0
  8. package/dist/cjs/dnd/abstractDragHandler.js.map +1 -1
  9. package/dist/cjs/dnd/droptarget.d.ts.map +1 -1
  10. package/dist/cjs/dnd/droptarget.js +1 -0
  11. package/dist/cjs/dnd/droptarget.js.map +1 -1
  12. package/dist/cjs/dnd/groupDragHandler.d.ts +0 -1
  13. package/dist/cjs/dnd/groupDragHandler.d.ts.map +1 -1
  14. package/dist/cjs/dnd/groupDragHandler.js +0 -3
  15. package/dist/cjs/dnd/groupDragHandler.js.map +1 -1
  16. package/dist/cjs/dockview/components/panel/content.d.ts.map +1 -1
  17. package/dist/cjs/dockview/components/panel/content.js +2 -2
  18. package/dist/cjs/dockview/components/panel/content.js.map +1 -1
  19. package/dist/cjs/dockview/components/tab/tab.d.ts +2 -2
  20. package/dist/cjs/dockview/components/tab/tab.d.ts.map +1 -1
  21. package/dist/cjs/dockview/components/tab/tab.js +2 -7
  22. package/dist/cjs/dockview/components/tab/tab.js.map +1 -1
  23. package/dist/cjs/dockview/components/titlebar/tabsContainer.d.ts.map +1 -1
  24. package/dist/cjs/dockview/components/titlebar/tabsContainer.js +27 -3
  25. package/dist/cjs/dockview/components/titlebar/tabsContainer.js.map +1 -1
  26. package/dist/cjs/dockview/dockviewComponent.d.ts +1 -1
  27. package/dist/cjs/dockview/dockviewComponent.d.ts.map +1 -1
  28. package/dist/cjs/dockview/dockviewComponent.js +23 -21
  29. package/dist/cjs/dockview/dockviewComponent.js.map +1 -1
  30. package/dist/cjs/dockview/dockviewGroupPanelModel.js +2 -2
  31. package/dist/cjs/dockview/dockviewGroupPanelModel.js.map +1 -1
  32. package/dist/cjs/dockview/dockviewPanel.d.ts +5 -4
  33. package/dist/cjs/dockview/dockviewPanel.d.ts.map +1 -1
  34. package/dist/cjs/dockview/dockviewPanel.js +33 -5
  35. package/dist/cjs/dockview/dockviewPanel.js.map +1 -1
  36. package/dist/cjs/dockview/dockviewPanelModel.d.ts +4 -3
  37. package/dist/cjs/dockview/dockviewPanelModel.d.ts.map +1 -1
  38. package/dist/cjs/dockview/dockviewPanelModel.js.map +1 -1
  39. package/dist/cjs/dockview/types.d.ts +1 -5
  40. package/dist/cjs/dockview/types.d.ts.map +1 -1
  41. package/dist/cjs/dockview/types.js.map +1 -1
  42. package/dist/cjs/dom.js +1 -5
  43. package/dist/cjs/dom.js.map +1 -1
  44. package/dist/cjs/events.d.ts +17 -0
  45. package/dist/cjs/events.d.ts.map +1 -1
  46. package/dist/cjs/events.js +94 -7
  47. package/dist/cjs/events.js.map +1 -1
  48. package/dist/cjs/gridview/baseComponentGridview.d.ts.map +1 -1
  49. package/dist/cjs/gridview/baseComponentGridview.js +2 -3
  50. package/dist/cjs/gridview/baseComponentGridview.js.map +1 -1
  51. package/dist/cjs/gridview/basePanelView.d.ts.map +1 -1
  52. package/dist/cjs/gridview/basePanelView.js +41 -8
  53. package/dist/cjs/gridview/basePanelView.js.map +1 -1
  54. package/dist/cjs/gridview/branchNode.d.ts +1 -1
  55. package/dist/cjs/gridview/branchNode.d.ts.map +1 -1
  56. package/dist/cjs/gridview/branchNode.js +3 -3
  57. package/dist/cjs/gridview/branchNode.js.map +1 -1
  58. package/dist/cjs/gridview/gridview.d.ts.map +1 -1
  59. package/dist/cjs/gridview/gridview.js +21 -13
  60. package/dist/cjs/gridview/gridview.js.map +1 -1
  61. package/dist/cjs/gridview/gridviewPanel.js +2 -2
  62. package/dist/cjs/gridview/gridviewPanel.js.map +1 -1
  63. package/dist/cjs/lifecycle.d.ts +1 -1
  64. package/dist/cjs/lifecycle.d.ts.map +1 -1
  65. package/dist/cjs/lifecycle.js +3 -3
  66. package/dist/cjs/lifecycle.js.map +1 -1
  67. package/dist/cjs/splitview/splitview.d.ts +3 -2
  68. package/dist/cjs/splitview/splitview.d.ts.map +1 -1
  69. package/dist/cjs/splitview/splitview.js +103 -84
  70. package/dist/cjs/splitview/splitview.js.map +1 -1
  71. package/dist/cjs/splitview/splitviewComponent.d.ts +2 -2
  72. package/dist/cjs/splitview/splitviewComponent.d.ts.map +1 -1
  73. package/dist/cjs/splitview/splitviewComponent.js +36 -20
  74. package/dist/cjs/splitview/splitviewComponent.js.map +1 -1
  75. package/dist/cjs/splitview/splitviewPanel.d.ts.map +1 -1
  76. package/dist/cjs/splitview/splitviewPanel.js.map +1 -1
  77. package/dist/dockview-core.amd.js +280 -189
  78. package/dist/dockview-core.amd.min.js +2 -2
  79. package/dist/dockview-core.amd.min.noStyle.js +2 -2
  80. package/dist/dockview-core.amd.noStyle.js +280 -189
  81. package/dist/dockview-core.cjs.js +280 -189
  82. package/dist/dockview-core.esm.js +280 -189
  83. package/dist/dockview-core.esm.min.js +2 -2
  84. package/dist/dockview-core.js +280 -189
  85. package/dist/dockview-core.min.js +2 -2
  86. package/dist/dockview-core.min.noStyle.js +2 -2
  87. package/dist/dockview-core.noStyle.js +280 -189
  88. package/dist/esm/api/dockviewPanelApi.js +1 -1
  89. package/dist/esm/api/dockviewPanelApi.js.map +1 -1
  90. package/dist/esm/api/panelApi.d.ts.map +1 -1
  91. package/dist/esm/api/panelApi.js +3 -5
  92. package/dist/esm/api/panelApi.js.map +1 -1
  93. package/dist/esm/dnd/abstractDragHandler.d.ts.map +1 -1
  94. package/dist/esm/dnd/abstractDragHandler.js +1 -0
  95. package/dist/esm/dnd/abstractDragHandler.js.map +1 -1
  96. package/dist/esm/dnd/droptarget.d.ts.map +1 -1
  97. package/dist/esm/dnd/droptarget.js +1 -0
  98. package/dist/esm/dnd/droptarget.js.map +1 -1
  99. package/dist/esm/dnd/groupDragHandler.d.ts +0 -1
  100. package/dist/esm/dnd/groupDragHandler.d.ts.map +1 -1
  101. package/dist/esm/dnd/groupDragHandler.js +0 -3
  102. package/dist/esm/dnd/groupDragHandler.js.map +1 -1
  103. package/dist/esm/dockview/components/panel/content.d.ts.map +1 -1
  104. package/dist/esm/dockview/components/panel/content.js +2 -2
  105. package/dist/esm/dockview/components/panel/content.js.map +1 -1
  106. package/dist/esm/dockview/components/tab/tab.d.ts +2 -2
  107. package/dist/esm/dockview/components/tab/tab.d.ts.map +1 -1
  108. package/dist/esm/dockview/components/tab/tab.js +2 -7
  109. package/dist/esm/dockview/components/tab/tab.js.map +1 -1
  110. package/dist/esm/dockview/components/titlebar/tabsContainer.d.ts.map +1 -1
  111. package/dist/esm/dockview/components/titlebar/tabsContainer.js +5 -3
  112. package/dist/esm/dockview/components/titlebar/tabsContainer.js.map +1 -1
  113. package/dist/esm/dockview/dockviewComponent.d.ts +1 -1
  114. package/dist/esm/dockview/dockviewComponent.d.ts.map +1 -1
  115. package/dist/esm/dockview/dockviewComponent.js +23 -21
  116. package/dist/esm/dockview/dockviewComponent.js.map +1 -1
  117. package/dist/esm/dockview/dockviewGroupPanelModel.js +2 -2
  118. package/dist/esm/dockview/dockviewGroupPanelModel.js.map +1 -1
  119. package/dist/esm/dockview/dockviewPanel.d.ts +5 -4
  120. package/dist/esm/dockview/dockviewPanel.d.ts.map +1 -1
  121. package/dist/esm/dockview/dockviewPanel.js +11 -5
  122. package/dist/esm/dockview/dockviewPanel.js.map +1 -1
  123. package/dist/esm/dockview/dockviewPanelModel.d.ts +4 -3
  124. package/dist/esm/dockview/dockviewPanelModel.d.ts.map +1 -1
  125. package/dist/esm/dockview/dockviewPanelModel.js.map +1 -1
  126. package/dist/esm/dockview/types.d.ts +1 -5
  127. package/dist/esm/dockview/types.d.ts.map +1 -1
  128. package/dist/esm/dockview/types.js.map +1 -1
  129. package/dist/esm/dom.js +1 -5
  130. package/dist/esm/dom.js.map +1 -1
  131. package/dist/esm/events.d.ts +17 -0
  132. package/dist/esm/events.d.ts.map +1 -1
  133. package/dist/esm/events.js +75 -7
  134. package/dist/esm/events.js.map +1 -1
  135. package/dist/esm/gridview/baseComponentGridview.d.ts.map +1 -1
  136. package/dist/esm/gridview/baseComponentGridview.js +2 -3
  137. package/dist/esm/gridview/baseComponentGridview.js.map +1 -1
  138. package/dist/esm/gridview/basePanelView.d.ts.map +1 -1
  139. package/dist/esm/gridview/basePanelView.js +16 -5
  140. package/dist/esm/gridview/basePanelView.js.map +1 -1
  141. package/dist/esm/gridview/branchNode.d.ts +1 -1
  142. package/dist/esm/gridview/branchNode.d.ts.map +1 -1
  143. package/dist/esm/gridview/branchNode.js +3 -3
  144. package/dist/esm/gridview/branchNode.js.map +1 -1
  145. package/dist/esm/gridview/gridview.d.ts.map +1 -1
  146. package/dist/esm/gridview/gridview.js +19 -11
  147. package/dist/esm/gridview/gridview.js.map +1 -1
  148. package/dist/esm/gridview/gridviewPanel.js +2 -2
  149. package/dist/esm/gridview/gridviewPanel.js.map +1 -1
  150. package/dist/esm/lifecycle.d.ts +1 -1
  151. package/dist/esm/lifecycle.d.ts.map +1 -1
  152. package/dist/esm/lifecycle.js +3 -3
  153. package/dist/esm/lifecycle.js.map +1 -1
  154. package/dist/esm/splitview/splitview.d.ts +3 -2
  155. package/dist/esm/splitview/splitview.d.ts.map +1 -1
  156. package/dist/esm/splitview/splitview.js +90 -84
  157. package/dist/esm/splitview/splitview.js.map +1 -1
  158. package/dist/esm/splitview/splitviewComponent.d.ts +2 -2
  159. package/dist/esm/splitview/splitviewComponent.d.ts.map +1 -1
  160. package/dist/esm/splitview/splitviewComponent.js +22 -16
  161. package/dist/esm/splitview/splitviewComponent.js.map +1 -1
  162. package/dist/esm/splitview/splitviewPanel.d.ts.map +1 -1
  163. package/dist/esm/splitview/splitviewPanel.js.map +1 -1
  164. package/package.json +2 -2
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * dockview-core
3
- * @version 1.7.3
3
+ * @version 1.7.4
4
4
  * @link https://github.com/mathuo/dockview
5
5
  * @license MIT
6
6
  */
@@ -119,9 +119,49 @@ var Event;
119
119
  };
120
120
  };
121
121
  })(Event || (Event = {}));
122
- // dumb event emitter with better typings than nodes event emitter
123
- // https://github.com/microsoft/vscode/blob/master/src/vs/base/common/event.ts
122
+ class LeakageMonitor {
123
+ constructor() {
124
+ this.events = new Map();
125
+ }
126
+ get size() {
127
+ return this.events.size;
128
+ }
129
+ add(event, stacktrace) {
130
+ this.events.set(event, stacktrace);
131
+ }
132
+ delete(event) {
133
+ this.events.delete(event);
134
+ }
135
+ clear() {
136
+ this.events.clear();
137
+ }
138
+ }
139
+ class Stacktrace {
140
+ static create() {
141
+ var _a;
142
+ return new Stacktrace((_a = new Error().stack) !== null && _a !== void 0 ? _a : '');
143
+ }
144
+ constructor(value) {
145
+ this.value = value;
146
+ }
147
+ print() {
148
+ console.warn(this.value);
149
+ }
150
+ }
151
+ class Listener {
152
+ constructor(callback, stacktrace) {
153
+ this.callback = callback;
154
+ this.stacktrace = stacktrace;
155
+ }
156
+ }
157
+ // relatively simple event emitter taken from https://github.com/microsoft/vscode/blob/master/src/vs/base/common/event.ts
124
158
  class Emitter {
159
+ static setLeakageMonitorEnabled(isEnabled) {
160
+ if (isEnabled !== Emitter.ENABLE_TRACKING) {
161
+ Emitter.MEMORY_LEAK_WATCHER.clear();
162
+ }
163
+ Emitter.ENABLE_TRACKING = isEnabled;
164
+ }
125
165
  constructor(options) {
126
166
  this.options = options;
127
167
  this._listeners = [];
@@ -129,11 +169,12 @@ class Emitter {
129
169
  }
130
170
  get event() {
131
171
  if (!this._event) {
132
- this._event = (listener) => {
172
+ this._event = (callback) => {
133
173
  var _a;
134
174
  if (((_a = this.options) === null || _a === void 0 ? void 0 : _a.replay) && this._last !== undefined) {
135
- listener(this._last);
175
+ callback(this._last);
136
176
  }
177
+ const listener = new Listener(callback, Emitter.ENABLE_TRACKING ? Stacktrace.create() : undefined);
137
178
  this._listeners.push(listener);
138
179
  return {
139
180
  dispose: () => {
@@ -141,23 +182,45 @@ class Emitter {
141
182
  if (index > -1) {
142
183
  this._listeners.splice(index, 1);
143
184
  }
185
+ else if (Emitter.ENABLE_TRACKING) ;
144
186
  },
145
187
  };
146
188
  };
189
+ if (Emitter.ENABLE_TRACKING) {
190
+ Emitter.MEMORY_LEAK_WATCHER.add(this._event, Stacktrace.create());
191
+ }
147
192
  }
148
193
  return this._event;
149
194
  }
150
195
  fire(e) {
151
196
  this._last = e;
152
197
  for (const listener of this._listeners) {
153
- listener(e);
198
+ listener.callback(e);
154
199
  }
155
200
  }
156
201
  dispose() {
157
- this._listeners = [];
158
- this._disposed = true;
202
+ if (!this._disposed) {
203
+ this._disposed = true;
204
+ if (this._listeners.length > 0) {
205
+ if (Emitter.ENABLE_TRACKING) {
206
+ queueMicrotask(() => {
207
+ var _a;
208
+ // don't check until stack of execution is completed to allow for out-of-order disposals within the same execution block
209
+ for (const listener of this._listeners) {
210
+ console.warn((_a = listener.stacktrace) === null || _a === void 0 ? void 0 : _a.print());
211
+ }
212
+ });
213
+ }
214
+ this._listeners = [];
215
+ }
216
+ if (Emitter.ENABLE_TRACKING && this._event) {
217
+ Emitter.MEMORY_LEAK_WATCHER.delete(this._event);
218
+ }
219
+ }
159
220
  }
160
221
  }
222
+ Emitter.ENABLE_TRACKING = false;
223
+ Emitter.MEMORY_LEAK_WATCHER = new LeakageMonitor();
161
224
  function addDisposableWindowListener(element, type, listener, options) {
162
225
  element.addEventListener(type, listener, options);
163
226
  return {
@@ -210,13 +273,13 @@ class CompositeDisposable {
210
273
  }
211
274
  constructor(...args) {
212
275
  this._isDisposed = false;
213
- this.disposables = args;
276
+ this._disposables = args;
214
277
  }
215
278
  addDisposables(...args) {
216
- args.forEach((arg) => this.disposables.push(arg));
279
+ args.forEach((arg) => this._disposables.push(arg));
217
280
  }
218
281
  dispose() {
219
- this.disposables.forEach((arg) => arg.dispose());
282
+ this._disposables.forEach((arg) => arg.dispose());
220
283
  this._isDisposed = true;
221
284
  }
222
285
  }
@@ -306,6 +369,7 @@ class FocusTracker extends CompositeDisposable {
306
369
  this.onDidFocus = this._onDidFocus.event;
307
370
  this._onDidBlur = new Emitter();
308
371
  this.onDidBlur = this._onDidBlur.event;
372
+ this.addDisposables(this._onDidFocus, this._onDidBlur);
309
373
  let hasFocus = isAncestor(document.activeElement, element);
310
374
  let loosingFocus = false;
311
375
  const onFocus = () => {
@@ -350,11 +414,6 @@ class FocusTracker extends CompositeDisposable {
350
414
  refreshState() {
351
415
  this._refreshStateHandler();
352
416
  }
353
- dispose() {
354
- super.dispose();
355
- this._onDidBlur.dispose();
356
- this._onDidFocus.dispose();
357
- }
358
417
  }
359
418
 
360
419
  function createComponent(id, componentName, components = {}, frameworkComponents = {}, createFrameworkComponent, fallback) {
@@ -583,7 +642,7 @@ class Splitview {
583
642
  this._orthogonalSize = value;
584
643
  }
585
644
  get length() {
586
- return this.views.length;
645
+ return this.viewItems.length;
587
646
  }
588
647
  get proportions() {
589
648
  return this._proportions ? [...this._proportions] : undefined;
@@ -602,12 +661,12 @@ class Splitview {
602
661
  : 'vertical');
603
662
  }
604
663
  get minimumSize() {
605
- return this.views.reduce((r, item) => r + item.minimumSize, 0);
664
+ return this.viewItems.reduce((r, item) => r + item.minimumSize, 0);
606
665
  }
607
666
  get maximumSize() {
608
667
  return this.length === 0
609
668
  ? Number.POSITIVE_INFINITY
610
- : this.views.reduce((r, item) => r + item.maximumSize, 0);
669
+ : this.viewItems.reduce((r, item) => r + item.maximumSize, 0);
611
670
  }
612
671
  get startSnappingEnabled() {
613
672
  return this._startSnappingEnabled;
@@ -631,7 +690,7 @@ class Splitview {
631
690
  }
632
691
  constructor(container, options) {
633
692
  this.container = container;
634
- this.views = [];
693
+ this.viewItems = [];
635
694
  this.sashes = [];
636
695
  this._size = 0;
637
696
  this._orthogonalSize = 0;
@@ -645,12 +704,12 @@ class Splitview {
645
704
  this.onDidAddView = this._onDidAddView.event;
646
705
  this._onDidRemoveView = new Emitter();
647
706
  this.onDidRemoveView = this._onDidRemoveView.event;
648
- this.resize = (index, delta, sizes = this.views.map((x) => x.size), lowPriorityIndexes, highPriorityIndexes, overloadMinDelta = Number.NEGATIVE_INFINITY, overloadMaxDelta = Number.POSITIVE_INFINITY, snapBefore, snapAfter) => {
649
- if (index < 0 || index > this.views.length) {
707
+ this.resize = (index, delta, sizes = this.viewItems.map((x) => x.size), lowPriorityIndexes, highPriorityIndexes, overloadMinDelta = Number.NEGATIVE_INFINITY, overloadMaxDelta = Number.POSITIVE_INFINITY, snapBefore, snapAfter) => {
708
+ if (index < 0 || index > this.viewItems.length) {
650
709
  return 0;
651
710
  }
652
711
  const upIndexes = range(index, -1);
653
- const downIndexes = range(index + 1, this.views.length);
712
+ const downIndexes = range(index + 1, this.viewItems.length);
654
713
  //
655
714
  if (highPriorityIndexes) {
656
715
  for (const i of highPriorityIndexes) {
@@ -665,34 +724,34 @@ class Splitview {
665
724
  }
666
725
  }
667
726
  //
668
- const upItems = upIndexes.map((i) => this.views[i]);
727
+ const upItems = upIndexes.map((i) => this.viewItems[i]);
669
728
  const upSizes = upIndexes.map((i) => sizes[i]);
670
729
  //
671
- const downItems = downIndexes.map((i) => this.views[i]);
730
+ const downItems = downIndexes.map((i) => this.viewItems[i]);
672
731
  const downSizes = downIndexes.map((i) => sizes[i]);
673
732
  //
674
- const minDeltaUp = upIndexes.reduce((_, i) => _ + this.views[i].minimumSize - sizes[i], 0);
675
- const maxDeltaUp = upIndexes.reduce((_, i) => _ + this.views[i].maximumSize - sizes[i], 0);
733
+ const minDeltaUp = upIndexes.reduce((_, i) => _ + this.viewItems[i].minimumSize - sizes[i], 0);
734
+ const maxDeltaUp = upIndexes.reduce((_, i) => _ + this.viewItems[i].maximumSize - sizes[i], 0);
676
735
  //
677
736
  const maxDeltaDown = downIndexes.length === 0
678
737
  ? Number.POSITIVE_INFINITY
679
- : downIndexes.reduce((_, i) => _ + sizes[i] - this.views[i].minimumSize, 0);
738
+ : downIndexes.reduce((_, i) => _ + sizes[i] - this.viewItems[i].minimumSize, 0);
680
739
  const minDeltaDown = downIndexes.length === 0
681
740
  ? Number.NEGATIVE_INFINITY
682
- : downIndexes.reduce((_, i) => _ + sizes[i] - this.views[i].maximumSize, 0);
741
+ : downIndexes.reduce((_, i) => _ + sizes[i] - this.viewItems[i].maximumSize, 0);
683
742
  //
684
743
  const minDelta = Math.max(minDeltaUp, minDeltaDown);
685
744
  const maxDelta = Math.min(maxDeltaDown, maxDeltaUp);
686
745
  //
687
746
  let snapped = false;
688
747
  if (snapBefore) {
689
- const snapView = this.views[snapBefore.index];
748
+ const snapView = this.viewItems[snapBefore.index];
690
749
  const visible = delta >= snapBefore.limitDelta;
691
750
  snapped = visible !== snapView.visible;
692
751
  snapView.setVisible(visible, snapBefore.size);
693
752
  }
694
753
  if (!snapped && snapAfter) {
695
- const snapView = this.views[snapAfter.index];
754
+ const snapView = this.viewItems[snapAfter.index];
696
755
  const visible = delta < snapAfter.limitDelta;
697
756
  snapped = visible !== snapView.visible;
698
757
  snapView.setVisible(visible, snapAfter.size);
@@ -754,7 +813,7 @@ class Splitview {
754
813
  );
755
814
  });
756
815
  // Initialize content size and proportions for first layout
757
- this.contentSize = this.views.reduce((r, i) => r + i.size, 0);
816
+ this.contentSize = this.viewItems.reduce((r, i) => r + i.size, 0);
758
817
  this.saveProportions();
759
818
  }
760
819
  }
@@ -771,18 +830,18 @@ class Splitview {
771
830
  }
772
831
  }
773
832
  isViewVisible(index) {
774
- if (index < 0 || index >= this.views.length) {
833
+ if (index < 0 || index >= this.viewItems.length) {
775
834
  throw new Error('Index out of bounds');
776
835
  }
777
- const viewItem = this.views[index];
836
+ const viewItem = this.viewItems[index];
778
837
  return viewItem.visible;
779
838
  }
780
839
  setViewVisible(index, visible) {
781
- if (index < 0 || index >= this.views.length) {
840
+ if (index < 0 || index >= this.viewItems.length) {
782
841
  throw new Error('Index out of bounds');
783
842
  }
784
843
  toggleClass(this.container, 'visible', visible);
785
- const viewItem = this.views[index];
844
+ const viewItem = this.viewItems[index];
786
845
  toggleClass(this.container, 'visible', visible);
787
846
  viewItem.setVisible(visible, viewItem.size);
788
847
  this.distributeEmptySpace(index);
@@ -790,33 +849,33 @@ class Splitview {
790
849
  this.saveProportions();
791
850
  }
792
851
  getViewSize(index) {
793
- if (index < 0 || index >= this.views.length) {
852
+ if (index < 0 || index >= this.viewItems.length) {
794
853
  return -1;
795
854
  }
796
- return this.views[index].size;
855
+ return this.viewItems[index].size;
797
856
  }
798
857
  resizeView(index, size) {
799
- if (index < 0 || index >= this.views.length) {
858
+ if (index < 0 || index >= this.viewItems.length) {
800
859
  return;
801
860
  }
802
- const indexes = range(this.views.length).filter((i) => i !== index);
861
+ const indexes = range(this.viewItems.length).filter((i) => i !== index);
803
862
  const lowPriorityIndexes = [
804
- ...indexes.filter((i) => this.views[i].priority === LayoutPriority.Low),
863
+ ...indexes.filter((i) => this.viewItems[i].priority === LayoutPriority.Low),
805
864
  index,
806
865
  ];
807
- const highPriorityIndexes = indexes.filter((i) => this.views[i].priority === LayoutPriority.High);
808
- const item = this.views[index];
866
+ const highPriorityIndexes = indexes.filter((i) => this.viewItems[i].priority === LayoutPriority.High);
867
+ const item = this.viewItems[index];
809
868
  size = Math.round(size);
810
869
  size = clamp(size, item.minimumSize, Math.min(item.maximumSize, this._size));
811
870
  item.size = size;
812
871
  this.relayout(lowPriorityIndexes, highPriorityIndexes);
813
872
  }
814
873
  getViews() {
815
- return this.views.map((x) => x.view);
874
+ return this.viewItems.map((x) => x.view);
816
875
  }
817
876
  onDidChange(item, size) {
818
- const index = this.views.indexOf(item);
819
- if (index < 0 || index >= this.views.length) {
877
+ const index = this.viewItems.indexOf(item);
878
+ if (index < 0 || index >= this.viewItems.length) {
820
879
  return;
821
880
  }
822
881
  size = typeof size === 'number' ? size : item.size;
@@ -824,7 +883,7 @@ class Splitview {
824
883
  item.size = size;
825
884
  this.relayout([index]);
826
885
  }
827
- addView(view, size = { type: 'distribute' }, index = this.views.length, skipLayout) {
886
+ addView(view, size = { type: 'distribute' }, index = this.viewItems.length, skipLayout) {
828
887
  const container = document.createElement('div');
829
888
  container.className = 'view';
830
889
  container.appendChild(view.element);
@@ -842,24 +901,25 @@ class Splitview {
842
901
  viewSize = view.minimumSize;
843
902
  }
844
903
  const disposable = view.onDidChange((newSize) => this.onDidChange(viewItem, newSize.size));
845
- const dispose = () => {
846
- disposable === null || disposable === void 0 ? void 0 : disposable.dispose();
847
- this.viewContainer.removeChild(container);
848
- };
849
- const viewItem = new ViewItem(container, view, viewSize, { dispose });
850
- if (index === this.views.length) {
904
+ const viewItem = new ViewItem(container, view, viewSize, {
905
+ dispose: () => {
906
+ disposable.dispose();
907
+ this.viewContainer.removeChild(container);
908
+ },
909
+ });
910
+ if (index === this.viewItems.length) {
851
911
  this.viewContainer.appendChild(container);
852
912
  }
853
913
  else {
854
914
  this.viewContainer.insertBefore(container, this.viewContainer.children.item(index));
855
915
  }
856
- this.views.splice(index, 0, viewItem);
857
- if (this.views.length > 1) {
916
+ this.viewItems.splice(index, 0, viewItem);
917
+ if (this.viewItems.length > 1) {
858
918
  //add sash
859
919
  const sash = document.createElement('div');
860
920
  sash.className = 'sash';
861
921
  const onStart = (event) => {
862
- for (const item of this.views) {
922
+ for (const item of this.viewItems) {
863
923
  item.enabled = false;
864
924
  }
865
925
  const iframes = [
@@ -874,27 +934,29 @@ class Splitview {
874
934
  : event.clientY;
875
935
  const sashIndex = firstIndex(this.sashes, (s) => s.container === sash);
876
936
  //
877
- const sizes = this.views.map((x) => x.size);
937
+ const sizes = this.viewItems.map((x) => x.size);
878
938
  //
879
939
  let snapBefore;
880
940
  let snapAfter;
881
941
  const upIndexes = range(sashIndex, -1);
882
- const downIndexes = range(sashIndex + 1, this.views.length);
883
- const minDeltaUp = upIndexes.reduce((r, i) => r + (this.views[i].minimumSize - sizes[i]), 0);
884
- const maxDeltaUp = upIndexes.reduce((r, i) => r + (this.views[i].viewMaximumSize - sizes[i]), 0);
942
+ const downIndexes = range(sashIndex + 1, this.viewItems.length);
943
+ const minDeltaUp = upIndexes.reduce((r, i) => r + (this.viewItems[i].minimumSize - sizes[i]), 0);
944
+ const maxDeltaUp = upIndexes.reduce((r, i) => r + (this.viewItems[i].viewMaximumSize - sizes[i]), 0);
885
945
  const maxDeltaDown = downIndexes.length === 0
886
946
  ? Number.POSITIVE_INFINITY
887
- : downIndexes.reduce((r, i) => r + (sizes[i] - this.views[i].minimumSize), 0);
947
+ : downIndexes.reduce((r, i) => r +
948
+ (sizes[i] - this.viewItems[i].minimumSize), 0);
888
949
  const minDeltaDown = downIndexes.length === 0
889
950
  ? Number.NEGATIVE_INFINITY
890
951
  : downIndexes.reduce((r, i) => r +
891
- (sizes[i] - this.views[i].viewMaximumSize), 0);
952
+ (sizes[i] -
953
+ this.viewItems[i].viewMaximumSize), 0);
892
954
  const minDelta = Math.max(minDeltaUp, minDeltaDown);
893
955
  const maxDelta = Math.min(maxDeltaDown, maxDeltaUp);
894
956
  const snapBeforeIndex = this.findFirstSnapIndex(upIndexes);
895
957
  const snapAfterIndex = this.findFirstSnapIndex(downIndexes);
896
958
  if (typeof snapBeforeIndex === 'number') {
897
- const snappedViewItem = this.views[snapBeforeIndex];
959
+ const snappedViewItem = this.viewItems[snapBeforeIndex];
898
960
  const halfSize = Math.floor(snappedViewItem.viewMinimumSize / 2);
899
961
  snapBefore = {
900
962
  index: snapBeforeIndex,
@@ -905,7 +967,7 @@ class Splitview {
905
967
  };
906
968
  }
907
969
  if (typeof snapAfterIndex === 'number') {
908
- const snappedViewItem = this.views[snapAfterIndex];
970
+ const snappedViewItem = this.viewItems[snapAfterIndex];
909
971
  const halfSize = Math.floor(snappedViewItem.viewMinimumSize / 2);
910
972
  snapAfter = {
911
973
  index: snapAfterIndex,
@@ -926,7 +988,7 @@ class Splitview {
926
988
  this.layoutViews();
927
989
  };
928
990
  const end = () => {
929
- for (const item of this.views) {
991
+ for (const item of this.viewItems) {
930
992
  item.enabled = true;
931
993
  }
932
994
  for (const iframe of iframes) {
@@ -966,7 +1028,7 @@ class Splitview {
966
1028
  distributeViewSizes() {
967
1029
  const flexibleViewItems = [];
968
1030
  let flexibleSize = 0;
969
- for (const item of this.views) {
1031
+ for (const item of this.viewItems) {
970
1032
  if (item.maximumSize - item.minimumSize > 0) {
971
1033
  flexibleViewItems.push(item);
972
1034
  flexibleSize += item.size;
@@ -976,17 +1038,17 @@ class Splitview {
976
1038
  for (const item of flexibleViewItems) {
977
1039
  item.size = clamp(size, item.minimumSize, item.maximumSize);
978
1040
  }
979
- const indexes = range(this.views.length);
980
- const lowPriorityIndexes = indexes.filter((i) => this.views[i].priority === LayoutPriority.Low);
981
- const highPriorityIndexes = indexes.filter((i) => this.views[i].priority === LayoutPriority.High);
1041
+ const indexes = range(this.viewItems.length);
1042
+ const lowPriorityIndexes = indexes.filter((i) => this.viewItems[i].priority === LayoutPriority.Low);
1043
+ const highPriorityIndexes = indexes.filter((i) => this.viewItems[i].priority === LayoutPriority.High);
982
1044
  this.relayout(lowPriorityIndexes, highPriorityIndexes);
983
1045
  }
984
1046
  removeView(index, sizing, skipLayout = false) {
985
1047
  // Remove view
986
- const viewItem = this.views.splice(index, 1)[0];
1048
+ const viewItem = this.viewItems.splice(index, 1)[0];
987
1049
  viewItem.dispose();
988
1050
  // Remove sash
989
- if (this.views.length >= 1) {
1051
+ if (this.viewItems.length >= 1) {
990
1052
  const sashIndex = Math.max(index - 1, 0);
991
1053
  const sashItem = this.sashes.splice(sashIndex, 1)[0];
992
1054
  sashItem.disposable();
@@ -1001,10 +1063,10 @@ class Splitview {
1001
1063
  return viewItem.view;
1002
1064
  }
1003
1065
  getViewCachedVisibleSize(index) {
1004
- if (index < 0 || index >= this.views.length) {
1066
+ if (index < 0 || index >= this.viewItems.length) {
1005
1067
  throw new Error('Index out of bounds');
1006
1068
  }
1007
- const viewItem = this.views[index];
1069
+ const viewItem = this.viewItems[index];
1008
1070
  return viewItem.cachedVisibleSize;
1009
1071
  }
1010
1072
  moveView(from, to) {
@@ -1020,14 +1082,14 @@ class Splitview {
1020
1082
  this.size = size;
1021
1083
  this.orthogonalSize = orthogonalSize;
1022
1084
  if (!this.proportions) {
1023
- const indexes = range(this.views.length);
1024
- const lowPriorityIndexes = indexes.filter((i) => this.views[i].priority === LayoutPriority.Low);
1025
- const highPriorityIndexes = indexes.filter((i) => this.views[i].priority === LayoutPriority.High);
1026
- this.resize(this.views.length - 1, size - previousSize, undefined, lowPriorityIndexes, highPriorityIndexes);
1085
+ const indexes = range(this.viewItems.length);
1086
+ const lowPriorityIndexes = indexes.filter((i) => this.viewItems[i].priority === LayoutPriority.Low);
1087
+ const highPriorityIndexes = indexes.filter((i) => this.viewItems[i].priority === LayoutPriority.High);
1088
+ this.resize(this.viewItems.length - 1, size - previousSize, undefined, lowPriorityIndexes, highPriorityIndexes);
1027
1089
  }
1028
1090
  else {
1029
- for (let i = 0; i < this.views.length; i++) {
1030
- const item = this.views[i];
1091
+ for (let i = 0; i < this.viewItems.length; i++) {
1092
+ const item = this.viewItems[i];
1031
1093
  item.size = clamp(Math.round(this.proportions[i] * size), item.minimumSize, item.maximumSize);
1032
1094
  }
1033
1095
  }
@@ -1035,18 +1097,18 @@ class Splitview {
1035
1097
  this.layoutViews();
1036
1098
  }
1037
1099
  relayout(lowPriorityIndexes, highPriorityIndexes) {
1038
- const contentSize = this.views.reduce((r, i) => r + i.size, 0);
1039
- this.resize(this.views.length - 1, this._size - contentSize, undefined, lowPriorityIndexes, highPriorityIndexes);
1100
+ const contentSize = this.viewItems.reduce((r, i) => r + i.size, 0);
1101
+ this.resize(this.viewItems.length - 1, this._size - contentSize, undefined, lowPriorityIndexes, highPriorityIndexes);
1040
1102
  this.distributeEmptySpace();
1041
1103
  this.layoutViews();
1042
1104
  this.saveProportions();
1043
1105
  }
1044
1106
  distributeEmptySpace(lowPriorityIndex) {
1045
- const contentSize = this.views.reduce((r, i) => r + i.size, 0);
1107
+ const contentSize = this.viewItems.reduce((r, i) => r + i.size, 0);
1046
1108
  let emptyDelta = this.size - contentSize;
1047
- const indexes = range(this.views.length - 1, -1);
1048
- const lowPriorityIndexes = indexes.filter((i) => this.views[i].priority === LayoutPriority.Low);
1049
- const highPriorityIndexes = indexes.filter((i) => this.views[i].priority === LayoutPriority.High);
1109
+ const indexes = range(this.viewItems.length - 1, -1);
1110
+ const lowPriorityIndexes = indexes.filter((i) => this.viewItems[i].priority === LayoutPriority.Low);
1111
+ const highPriorityIndexes = indexes.filter((i) => this.viewItems[i].priority === LayoutPriority.High);
1050
1112
  for (const index of highPriorityIndexes) {
1051
1113
  pushToStart(indexes, index);
1052
1114
  }
@@ -1057,7 +1119,7 @@ class Splitview {
1057
1119
  pushToEnd(indexes, lowPriorityIndex);
1058
1120
  }
1059
1121
  for (let i = 0; emptyDelta !== 0 && i < indexes.length; i++) {
1060
- const item = this.views[indexes[i]];
1122
+ const item = this.viewItems[indexes[i]];
1061
1123
  const size = clamp(item.size + emptyDelta, item.minimumSize, item.maximumSize);
1062
1124
  const viewDelta = size - item.size;
1063
1125
  emptyDelta -= viewDelta;
@@ -1066,16 +1128,16 @@ class Splitview {
1066
1128
  }
1067
1129
  saveProportions() {
1068
1130
  if (this.proportionalLayout && this.contentSize > 0) {
1069
- this._proportions = this.views.map((i) => i.size / this.contentSize);
1131
+ this._proportions = this.viewItems.map((i) => i.size / this.contentSize);
1070
1132
  }
1071
1133
  }
1072
1134
  layoutViews() {
1073
- this.contentSize = this.views.reduce((r, i) => r + i.size, 0);
1135
+ this.contentSize = this.viewItems.reduce((r, i) => r + i.size, 0);
1074
1136
  let sum = 0;
1075
1137
  const x = [];
1076
1138
  this.updateSashEnablement();
1077
- for (let i = 0; i < this.views.length - 1; i++) {
1078
- sum += this.views[i].size;
1139
+ for (let i = 0; i < this.viewItems.length - 1; i++) {
1140
+ sum += this.viewItems[i].size;
1079
1141
  x.push(sum);
1080
1142
  const offset = Math.min(Math.max(0, sum - 2), this.size - 4);
1081
1143
  if (this._orientation === Orientation.HORIZONTAL) {
@@ -1087,7 +1149,7 @@ class Splitview {
1087
1149
  this.sashes[i].container.style.top = `${offset}px`;
1088
1150
  }
1089
1151
  }
1090
- this.views.forEach((view, i) => {
1152
+ this.viewItems.forEach((view, i) => {
1091
1153
  if (this._orientation === Orientation.HORIZONTAL) {
1092
1154
  view.container.style.width = `${view.size}px`;
1093
1155
  view.container.style.left = i == 0 ? '0px' : `${x[i - 1]}px`;
@@ -1106,7 +1168,7 @@ class Splitview {
1106
1168
  findFirstSnapIndex(indexes) {
1107
1169
  // visible views first
1108
1170
  for (const index of indexes) {
1109
- const viewItem = this.views[index];
1171
+ const viewItem = this.viewItems[index];
1110
1172
  if (!viewItem.visible) {
1111
1173
  continue;
1112
1174
  }
@@ -1116,7 +1178,7 @@ class Splitview {
1116
1178
  }
1117
1179
  // then, hidden views
1118
1180
  for (const index of indexes) {
1119
- const viewItem = this.views[index];
1181
+ const viewItem = this.viewItems[index];
1120
1182
  if (viewItem.visible &&
1121
1183
  viewItem.maximumSize - viewItem.minimumSize > 0) {
1122
1184
  return undefined;
@@ -1129,10 +1191,10 @@ class Splitview {
1129
1191
  }
1130
1192
  updateSashEnablement() {
1131
1193
  let previous = false;
1132
- const collapsesDown = this.views.map((i) => (previous = i.size - i.minimumSize > 0 || previous));
1194
+ const collapsesDown = this.viewItems.map((i) => (previous = i.size - i.minimumSize > 0 || previous));
1133
1195
  previous = false;
1134
- const expandsDown = this.views.map((i) => (previous = i.maximumSize - i.size > 0 || previous));
1135
- const reverseViews = [...this.views].reverse();
1196
+ const expandsDown = this.viewItems.map((i) => (previous = i.maximumSize - i.size > 0 || previous));
1197
+ const reverseViews = [...this.viewItems].reverse();
1136
1198
  previous = false;
1137
1199
  const collapsesUp = reverseViews
1138
1200
  .map((i) => (previous = i.size - i.minimumSize > 0 || previous))
@@ -1144,19 +1206,19 @@ class Splitview {
1144
1206
  let position = 0;
1145
1207
  for (let index = 0; index < this.sashes.length; index++) {
1146
1208
  const sash = this.sashes[index];
1147
- const viewItem = this.views[index];
1209
+ const viewItem = this.viewItems[index];
1148
1210
  position += viewItem.size;
1149
1211
  const min = !(collapsesDown[index] && expandsUp[index + 1]);
1150
1212
  const max = !(expandsDown[index] && collapsesUp[index + 1]);
1151
1213
  if (min && max) {
1152
1214
  const upIndexes = range(index, -1);
1153
- const downIndexes = range(index + 1, this.views.length);
1215
+ const downIndexes = range(index + 1, this.viewItems.length);
1154
1216
  const snapBeforeIndex = this.findFirstSnapIndex(upIndexes);
1155
1217
  const snapAfterIndex = this.findFirstSnapIndex(downIndexes);
1156
1218
  const snappedBefore = typeof snapBeforeIndex === 'number' &&
1157
- !this.views[snapBeforeIndex].visible;
1219
+ !this.viewItems[snapBeforeIndex].visible;
1158
1220
  const snappedAfter = typeof snapAfterIndex === 'number' &&
1159
- !this.views[snapAfterIndex].visible;
1221
+ !this.viewItems[snapAfterIndex].visible;
1160
1222
  if (snappedBefore &&
1161
1223
  collapsesUp[index] &&
1162
1224
  (position > 0 || this.startSnappingEnabled)) {
@@ -1216,6 +1278,9 @@ class Splitview {
1216
1278
  break;
1217
1279
  }
1218
1280
  }
1281
+ for (const viewItem of this.viewItems) {
1282
+ viewItem.dispose();
1283
+ }
1219
1284
  this.element.remove();
1220
1285
  }
1221
1286
  }
@@ -1650,7 +1715,7 @@ class BranchNode extends CompositeDisposable {
1650
1715
  throw new Error('Invalid index');
1651
1716
  }
1652
1717
  this.splitview.removeView(index, sizing);
1653
- this._removeChild(index);
1718
+ return this._removeChild(index);
1654
1719
  }
1655
1720
  _addChild(node, index) {
1656
1721
  this.children.splice(index, 0, node);
@@ -1672,10 +1737,10 @@ class BranchNode extends CompositeDisposable {
1672
1737
  });
1673
1738
  }
1674
1739
  dispose() {
1675
- super.dispose();
1676
1740
  this._childrenDisposable.dispose();
1677
- this.children.forEach((child) => child.dispose());
1678
1741
  this.splitview.dispose();
1742
+ this.children.forEach((child) => child.dispose());
1743
+ super.dispose();
1679
1744
  }
1680
1745
  }
1681
1746
 
@@ -1905,7 +1970,8 @@ class Gridview {
1905
1970
  if (oldRoot.children.length === 1) {
1906
1971
  // can remove one level of redundant branching if there is only a single child
1907
1972
  const childReference = oldRoot.children[0];
1908
- oldRoot.removeChild(0); // remove to prevent disposal when disposing of unwanted root
1973
+ const child = oldRoot.removeChild(0); // remove to prevent disposal when disposing of unwanted root
1974
+ child.dispose();
1909
1975
  oldRoot.dispose();
1910
1976
  this._root.addChild(
1911
1977
  /**
@@ -2012,7 +2078,8 @@ class Gridview {
2012
2078
  if (typeof newSiblingCachedVisibleSize === 'number') {
2013
2079
  newSiblingSize = Sizing.Invisible(newSiblingCachedVisibleSize);
2014
2080
  }
2015
- grandParent.removeChild(parentIndex);
2081
+ const child = grandParent.removeChild(parentIndex);
2082
+ child.dispose();
2016
2083
  const newParent = new BranchNode(parent.orientation, this.proportionalLayout, this.styles, parent.size, parent.orthogonalSize);
2017
2084
  grandParent.addChild(newParent, parent.size, parentIndex);
2018
2085
  const newSibling = new LeafNode(parent.view, grandParent.orientation, parent.size);
@@ -2038,30 +2105,36 @@ class Gridview {
2038
2105
  if (!(node instanceof LeafNode)) {
2039
2106
  throw new Error('Invalid location');
2040
2107
  }
2041
- parent.removeChild(index, sizing);
2108
+ const view = node.view;
2109
+ node.dispose(); // dispose of node
2110
+ const child = parent.removeChild(index, sizing);
2111
+ child.dispose();
2042
2112
  if (parent.children.length === 0) {
2043
- return node.view;
2113
+ return view;
2044
2114
  }
2045
2115
  if (parent.children.length > 1) {
2046
- return node.view;
2116
+ return view;
2047
2117
  }
2048
2118
  const sibling = parent.children[0];
2049
2119
  if (pathToParent.length === 0) {
2050
2120
  // parent is root
2051
2121
  if (sibling instanceof LeafNode) {
2052
- return node.view;
2122
+ return view;
2053
2123
  }
2054
2124
  // we must promote sibling to be the new root
2055
- parent.removeChild(0, sizing);
2125
+ const child = parent.removeChild(0, sizing);
2126
+ child.dispose();
2056
2127
  this.root = sibling;
2057
- return node.view;
2128
+ return view;
2058
2129
  }
2059
2130
  const [grandParent, ..._] = [...pathToParent].reverse();
2060
2131
  const [parentIndex, ...__] = [...rest].reverse();
2061
2132
  const isSiblingVisible = parent.isChildVisible(0);
2062
- parent.removeChild(0, sizing);
2133
+ const childNode = parent.removeChild(0, sizing);
2134
+ childNode.dispose();
2063
2135
  const sizes = grandParent.children.map((_size, i) => grandParent.getChildSize(i));
2064
- grandParent.removeChild(parentIndex, sizing);
2136
+ const parentNode = grandParent.removeChild(parentIndex, sizing);
2137
+ parentNode.dispose();
2065
2138
  if (sibling instanceof BranchNode) {
2066
2139
  sizes.splice(parentIndex, 1, ...sibling.children.map((c) => c.size));
2067
2140
  for (let i = 0; i < sibling.children.length; i++) {
@@ -2079,7 +2152,7 @@ class Gridview {
2079
2152
  for (let i = 0; i < sizes.length; i++) {
2080
2153
  grandParent.resizeChild(i, sizes[i]);
2081
2154
  }
2082
- return node.view;
2155
+ return view;
2083
2156
  }
2084
2157
  layout(width, height) {
2085
2158
  const [size, orthogonalSize] = this.root.orientation === Orientation.HORIZONTAL
@@ -2574,6 +2647,7 @@ class Droptarget extends CompositeDisposable {
2574
2647
  }
2575
2648
  dispose() {
2576
2649
  this.removeDropTarget();
2650
+ super.dispose();
2577
2651
  }
2578
2652
  toggleClasses(quadrant, width, height) {
2579
2653
  var _a, _b, _c, _d;
@@ -2751,8 +2825,8 @@ class ContentContainer extends CompositeDisposable {
2751
2825
  if (this.panel.view) {
2752
2826
  const _onDidFocus = this.panel.view.content.onDidFocus;
2753
2827
  const _onDidBlur = this.panel.view.content.onDidBlur;
2754
- const { onDidFocus, onDidBlur } = trackFocus(this._element);
2755
- disposable.addDisposables(onDidFocus(() => this._onDidFocus.fire()), onDidBlur(() => this._onDidBlur.fire()));
2828
+ const focusTracker = trackFocus(this._element);
2829
+ disposable.addDisposables(focusTracker, focusTracker.onDidFocus(() => this._onDidFocus.fire()), focusTracker.onDidBlur(() => this._onDidBlur.fire()));
2756
2830
  if (_onDidFocus) {
2757
2831
  disposable.addDisposables(_onDidFocus(() => this._onDidFocus.fire()));
2758
2832
  }
@@ -2795,6 +2869,7 @@ class DragHandler extends CompositeDisposable {
2795
2869
  this._onDragStart = new Emitter();
2796
2870
  this.onDragStart = this._onDragStart.event;
2797
2871
  this.iframes = [];
2872
+ this.addDisposables(this._onDragStart);
2798
2873
  this.configure();
2799
2874
  }
2800
2875
  configure() {
@@ -2845,13 +2920,12 @@ class Tab extends CompositeDisposable {
2845
2920
  this.onChanged = this._onChanged.event;
2846
2921
  this._onDropped = new Emitter();
2847
2922
  this.onDrop = this._onDropped.event;
2848
- this.addDisposables(this._onChanged, this._onDropped);
2849
2923
  this._element = document.createElement('div');
2850
2924
  this._element.className = 'tab';
2851
2925
  this._element.tabIndex = 0;
2852
2926
  this._element.draggable = true;
2853
2927
  toggleClass(this.element, 'inactive-tab', true);
2854
- this.addDisposables(new (class Handler extends DragHandler {
2928
+ this.addDisposables(this._onChanged, this._onDropped, new (class Handler extends DragHandler {
2855
2929
  constructor() {
2856
2930
  super(...arguments);
2857
2931
  this.panelTransfer = LocalSelectionTransfer.getInstance();
@@ -2864,9 +2938,6 @@ class Tab extends CompositeDisposable {
2864
2938
  },
2865
2939
  };
2866
2940
  }
2867
- dispose() {
2868
- //
2869
- }
2870
2941
  })(this._element));
2871
2942
  this.addDisposables(addDisposableListener(this._element, 'mousedown', (event) => {
2872
2943
  if (event.defaultPrevented) {
@@ -2901,7 +2972,7 @@ class Tab extends CompositeDisposable {
2901
2972
  });
2902
2973
  this.addDisposables(this.droptarget.onDrop((event) => {
2903
2974
  this._onDropped.fire(event);
2904
- }));
2975
+ }), this.droptarget);
2905
2976
  }
2906
2977
  setActive(isActive) {
2907
2978
  toggleClass(this.element, 'active-tab', isActive);
@@ -2916,7 +2987,6 @@ class Tab extends CompositeDisposable {
2916
2987
  }
2917
2988
  dispose() {
2918
2989
  super.dispose();
2919
- this.droptarget.dispose();
2920
2990
  }
2921
2991
  }
2922
2992
 
@@ -2962,9 +3032,6 @@ class GroupDragHandler extends DragHandler {
2962
3032
  },
2963
3033
  };
2964
3034
  }
2965
- dispose() {
2966
- //
2967
- }
2968
3035
  }
2969
3036
 
2970
3037
  class VoidContainer extends CompositeDisposable {
@@ -3120,6 +3187,7 @@ class TabsContainer extends CompositeDisposable {
3120
3187
  const tabToRemove = this.tabs.splice(index, 1)[0];
3121
3188
  const { value, disposable } = tabToRemove;
3122
3189
  disposable.dispose();
3190
+ value.dispose();
3123
3191
  value.element.remove();
3124
3192
  }
3125
3193
  setActivePanel(panel) {
@@ -3163,9 +3231,10 @@ class TabsContainer extends CompositeDisposable {
3163
3231
  }
3164
3232
  dispose() {
3165
3233
  super.dispose();
3166
- this.tabs.forEach((tab) => {
3167
- tab.disposable.dispose();
3168
- });
3234
+ for (const { value, disposable } of this.tabs) {
3235
+ disposable.dispose();
3236
+ value.dispose();
3237
+ }
3169
3238
  this.tabs = [];
3170
3239
  }
3171
3240
  }
@@ -3263,7 +3332,7 @@ class DockviewGroupPanelModel extends CompositeDisposable {
3263
3332
  container.append(this.tabsContainer.element, this.contentContainer.element);
3264
3333
  this.header.hidden = !!options.hideHeader;
3265
3334
  this.locked = !!options.locked;
3266
- this.addDisposables(this._onMove, this._onDidChange, this._onDidDrop, this._onDidAddPanel, this._onDidRemovePanel, this._onDidActivePanelChange, this.tabsContainer.onDrop((event) => {
3335
+ this.addDisposables(this.tabsContainer.onDrop((event) => {
3267
3336
  this.handleDropEvent(event.event, 'center', event.index);
3268
3337
  }), this.contentContainer.onDidFocus(() => {
3269
3338
  this.accessor.doSetGroupActive(this.groupPanel, true);
@@ -3271,7 +3340,7 @@ class DockviewGroupPanelModel extends CompositeDisposable {
3271
3340
  // noop
3272
3341
  }), this.dropTarget.onDrop((event) => {
3273
3342
  this.handleDropEvent(event.nativeEvent, event.position);
3274
- }));
3343
+ }), this._onMove, this._onDidChange, this._onDidDrop, this._onDidAddPanel, this._onDidRemovePanel, this._onDidActivePanelChange);
3275
3344
  }
3276
3345
  initialize() {
3277
3346
  var _a, _b;
@@ -3705,8 +3774,7 @@ class BaseGrid extends Resizable {
3705
3774
  this.layout(0, 0, true); // set some elements height/widths
3706
3775
  this.addDisposables(this.gridview.onDidChange(() => {
3707
3776
  this._bufferOnDidLayoutChange.fire();
3708
- }));
3709
- this.addDisposables(Event.any(this.onDidAddGroup, this.onDidRemoveGroup, this.onDidActiveGroupChange)(() => {
3777
+ }), Event.any(this.onDidAddGroup, this.onDidRemoveGroup, this.onDidActiveGroupChange)(() => {
3710
3778
  this._bufferOnDidLayoutChange.fire();
3711
3779
  }), this._bufferOnDidLayoutChange.onEvent(() => {
3712
3780
  this._onDidLayoutChange.fire();
@@ -3809,7 +3877,6 @@ class BaseGrid extends Resizable {
3809
3877
  this.gridview.layout(width, height);
3810
3878
  }
3811
3879
  dispose() {
3812
- super.dispose();
3813
3880
  this._onDidActiveGroupChange.dispose();
3814
3881
  this._onDidAddGroup.dispose();
3815
3882
  this._onDidRemoveGroup.dispose();
@@ -3818,6 +3885,7 @@ class BaseGrid extends Resizable {
3818
3885
  group.dispose();
3819
3886
  }
3820
3887
  this.gridview.dispose();
3888
+ super.dispose();
3821
3889
  }
3822
3890
  }
3823
3891
 
@@ -3881,7 +3949,7 @@ class PanelApiImpl extends CompositeDisposable {
3881
3949
  //
3882
3950
  this._onUpdateParameters = new Emitter();
3883
3951
  this.onUpdateParameters = this._onUpdateParameters.event;
3884
- this.addDisposables(this.panelUpdatesDisposable, this._onDidDimensionChange, this._onDidChangeFocus, this._onDidVisibilityChange, this._onDidActiveChange, this._onFocusEvent, this._onActiveChange, this._onVisibilityChange, this._onUpdateParameters, this.onDidFocusChange((event) => {
3952
+ this.addDisposables(this.onDidFocusChange((event) => {
3885
3953
  this._isFocused = event.isFocused;
3886
3954
  }), this.onDidActiveChange((event) => {
3887
3955
  this._isActive = event.isActive;
@@ -3890,14 +3958,12 @@ class PanelApiImpl extends CompositeDisposable {
3890
3958
  }), this.onDidDimensionsChange((event) => {
3891
3959
  this._width = event.width;
3892
3960
  this._height = event.height;
3893
- }));
3961
+ }), this.panelUpdatesDisposable, this._onDidDimensionChange, this._onDidChangeFocus, this._onDidVisibilityChange, this._onDidActiveChange, this._onFocusEvent, this._onActiveChange, this._onVisibilityChange, this._onUpdateParameters);
3894
3962
  }
3895
3963
  initialize(panel) {
3896
3964
  this.panelUpdatesDisposable.value = this._onUpdateParameters.event((parameters) => {
3897
3965
  panel.update({
3898
- params: {
3899
- params: parameters,
3900
- },
3966
+ params: parameters,
3901
3967
  });
3902
3968
  });
3903
3969
  }
@@ -3992,12 +4058,12 @@ class BasePanelView extends CompositeDisposable {
3992
4058
  this._element.style.height = '100%';
3993
4059
  this._element.style.width = '100%';
3994
4060
  this._element.style.overflow = 'hidden';
3995
- const { onDidFocus, onDidBlur } = trackFocus(this._element);
3996
- this.addDisposables(this.api, onDidFocus(() => {
4061
+ const focusTracker = trackFocus(this._element);
4062
+ this.addDisposables(this.api, focusTracker.onDidFocus(() => {
3997
4063
  this.api._onDidChangeFocus.fire({ isFocused: true });
3998
- }), onDidBlur(() => {
4064
+ }), focusTracker.onDidBlur(() => {
3999
4065
  this.api._onDidChangeFocus.fire({ isFocused: false });
4000
- }));
4066
+ }), focusTracker);
4001
4067
  }
4002
4068
  focus() {
4003
4069
  this.api._onFocusEvent.fire();
@@ -4018,7 +4084,18 @@ class BasePanelView extends CompositeDisposable {
4018
4084
  }
4019
4085
  update(event) {
4020
4086
  var _a, _b;
4087
+ // merge the new parameters with the existing parameters
4021
4088
  this._params = Object.assign(Object.assign({}, this._params), { params: Object.assign(Object.assign({}, (_a = this._params) === null || _a === void 0 ? void 0 : _a.params), event.params) });
4089
+ /**
4090
+ * delete new keys that have a value of undefined,
4091
+ * allow values of null
4092
+ */
4093
+ for (const key of Object.keys(event.params)) {
4094
+ if (event.params[key] === undefined) {
4095
+ delete this._params.params[key];
4096
+ }
4097
+ }
4098
+ // update the view with the updated props
4022
4099
  (_b = this.part) === null || _b === void 0 ? void 0 : _b.update({ params: this._params.params });
4023
4100
  }
4024
4101
  toJSON() {
@@ -4032,9 +4109,9 @@ class BasePanelView extends CompositeDisposable {
4032
4109
  }
4033
4110
  dispose() {
4034
4111
  var _a;
4035
- super.dispose();
4036
4112
  this.api.dispose();
4037
4113
  (_a = this.part) === null || _a === void 0 ? void 0 : _a.dispose();
4114
+ super.dispose();
4038
4115
  }
4039
4116
  }
4040
4117
 
@@ -4413,7 +4490,7 @@ class GridviewPanel extends BasePanelView {
4413
4490
  this._maximumHeight = options.maximumHeight;
4414
4491
  }
4415
4492
  this.api.initialize(this); // TODO: required to by-pass 'super before this' requirement
4416
- this.addDisposables(this._onDidChange, this.api.onVisibilityChange((event) => {
4493
+ this.addDisposables(this.api.onVisibilityChange((event) => {
4417
4494
  const { isVisible } = event;
4418
4495
  const { accessor } = this._params;
4419
4496
  accessor.setVisible(this, isVisible);
@@ -4442,7 +4519,7 @@ class GridviewPanel extends BasePanelView {
4442
4519
  height: event.height,
4443
4520
  width: event.width,
4444
4521
  });
4445
- }));
4522
+ }), this._onDidChange);
4446
4523
  }
4447
4524
  setVisible(isVisible) {
4448
4525
  this.api._onDidVisibilityChange.fire({ isVisible });
@@ -4599,7 +4676,7 @@ class DockviewPanelApiImpl extends GridviewPanelApiImpl {
4599
4676
  this.addDisposables(this.disposable, this._onDidTitleChange, this._onDidGroupChange, this._onDidActiveGroupChange);
4600
4677
  }
4601
4678
  setTitle(title) {
4602
- this.panel.update({ params: { title } });
4679
+ this.panel.setTitle(title);
4603
4680
  }
4604
4681
  close() {
4605
4682
  this.group.model.closePanel(this.panel);
@@ -4664,12 +4741,18 @@ class DockviewPanel extends CompositeDisposable {
4664
4741
  }
4665
4742
  }
4666
4743
  update(event) {
4667
- const params = event.params;
4668
- this._params = Object.assign(Object.assign({}, (this._params || {})), event.params.params);
4669
- if (params.title !== this.title) {
4670
- this._title = params.title;
4671
- this.api._onDidTitleChange.fire({ title: params.title });
4744
+ // merge the new parameters with the existing parameters
4745
+ this._params = Object.assign(Object.assign({}, (this._params || {})), event.params);
4746
+ /**
4747
+ * delete new keys that have a value of undefined,
4748
+ * allow values of null
4749
+ */
4750
+ for (const key of Object.keys(event.params)) {
4751
+ if (event.params[key] === undefined) {
4752
+ delete this._params[key];
4753
+ }
4672
4754
  }
4755
+ // update the view with the updated props
4673
4756
  this.view.update({
4674
4757
  params: {
4675
4758
  params: this._params,
@@ -5045,7 +5128,7 @@ class DockviewComponent extends BaseGrid {
5045
5128
  size: { type: 'pixels', value: 20 },
5046
5129
  },
5047
5130
  });
5048
- this.addDisposables(dropTarget, dropTarget.onDrop((event) => {
5131
+ this.addDisposables(dropTarget.onDrop((event) => {
5049
5132
  const data = getPanelData();
5050
5133
  if (data) {
5051
5134
  this.moveGroupOrPanel(this.orthogonalize(event.position), data.groupId, data.panelId || undefined, 'center');
@@ -5053,7 +5136,7 @@ class DockviewComponent extends BaseGrid {
5053
5136
  else {
5054
5137
  this._onDidDrop.fire(Object.assign(Object.assign({}, event), { api: this._api, group: null, getData: getPanelData }));
5055
5138
  }
5056
- }));
5139
+ }), dropTarget);
5057
5140
  this._api = new DockviewApi(this);
5058
5141
  this.updateWatermark();
5059
5142
  }
@@ -5377,31 +5460,33 @@ class DockviewComponent extends BaseGrid {
5377
5460
  }
5378
5461
  super.doRemoveGroup(group, { skipActive });
5379
5462
  }
5380
- moveGroupOrPanel(referenceGroup, groupId, itemId, target, index) {
5463
+ moveGroupOrPanel(destinationGroup, sourceGroupId, sourceItemId, destinationTarget, destinationIndex) {
5381
5464
  var _a;
5382
- const sourceGroup = groupId
5383
- ? (_a = this._groups.get(groupId)) === null || _a === void 0 ? void 0 : _a.value
5465
+ const sourceGroup = sourceGroupId
5466
+ ? (_a = this._groups.get(sourceGroupId)) === null || _a === void 0 ? void 0 : _a.value
5384
5467
  : undefined;
5385
- if (itemId === undefined) {
5468
+ if (sourceItemId === undefined) {
5386
5469
  if (sourceGroup) {
5387
- this.moveGroup(sourceGroup, referenceGroup, target);
5470
+ this.moveGroup(sourceGroup, destinationGroup, destinationTarget);
5388
5471
  }
5389
5472
  return;
5390
5473
  }
5391
- if (!target || target === 'center') {
5392
- const groupItem = (sourceGroup === null || sourceGroup === void 0 ? void 0 : sourceGroup.model.removePanel(itemId)) ||
5393
- this.panels.find((panel) => panel.id === itemId);
5474
+ if (!destinationTarget || destinationTarget === 'center') {
5475
+ const groupItem = (sourceGroup === null || sourceGroup === void 0 ? void 0 : sourceGroup.model.removePanel(sourceItemId)) ||
5476
+ this.panels.find((panel) => panel.id === sourceItemId);
5394
5477
  if (!groupItem) {
5395
- throw new Error(`No panel with id ${itemId}`);
5478
+ throw new Error(`No panel with id ${sourceItemId}`);
5396
5479
  }
5397
5480
  if ((sourceGroup === null || sourceGroup === void 0 ? void 0 : sourceGroup.model.size) === 0) {
5398
5481
  this.doRemoveGroup(sourceGroup);
5399
5482
  }
5400
- referenceGroup.model.openPanel(groupItem, { index });
5483
+ destinationGroup.model.openPanel(groupItem, {
5484
+ index: destinationIndex,
5485
+ });
5401
5486
  }
5402
5487
  else {
5403
- const referenceLocation = getGridLocation(referenceGroup.element);
5404
- const targetLocation = getRelativeLocation(this.gridview.orientation, referenceLocation, target);
5488
+ const referenceLocation = getGridLocation(destinationGroup.element);
5489
+ const targetLocation = getRelativeLocation(this.gridview.orientation, referenceLocation, destinationTarget);
5405
5490
  if (sourceGroup && sourceGroup.size < 2) {
5406
5491
  const [targetParentLocation, to] = tail(targetLocation);
5407
5492
  const sourceLocation = getGridLocation(sourceGroup.element);
@@ -5419,18 +5504,18 @@ class DockviewComponent extends BaseGrid {
5419
5504
  skipDispose: true,
5420
5505
  });
5421
5506
  // after deleting the group we need to re-evaulate the ref location
5422
- const updatedReferenceLocation = getGridLocation(referenceGroup.element);
5423
- const location = getRelativeLocation(this.gridview.orientation, updatedReferenceLocation, target);
5507
+ const updatedReferenceLocation = getGridLocation(destinationGroup.element);
5508
+ const location = getRelativeLocation(this.gridview.orientation, updatedReferenceLocation, destinationTarget);
5424
5509
  this.doAddGroup(targetGroup, location);
5425
5510
  }
5426
5511
  }
5427
5512
  else {
5428
- const groupItem = (sourceGroup === null || sourceGroup === void 0 ? void 0 : sourceGroup.model.removePanel(itemId)) ||
5429
- this.panels.find((panel) => panel.id === itemId);
5513
+ const groupItem = (sourceGroup === null || sourceGroup === void 0 ? void 0 : sourceGroup.model.removePanel(sourceItemId)) ||
5514
+ this.panels.find((panel) => panel.id === sourceItemId);
5430
5515
  if (!groupItem) {
5431
- throw new Error(`No panel with id ${itemId}`);
5516
+ throw new Error(`No panel with id ${sourceItemId}`);
5432
5517
  }
5433
- const dropLocation = getRelativeLocation(this.gridview.orientation, referenceLocation, target);
5518
+ const dropLocation = getRelativeLocation(this.gridview.orientation, referenceLocation, destinationTarget);
5434
5519
  const group = this.createGroupAtLocation(dropLocation);
5435
5520
  group.model.openPanel(groupItem);
5436
5521
  }
@@ -5524,11 +5609,11 @@ class DockviewComponent extends BaseGrid {
5524
5609
  return (_a = Array.from(this._groups.values()).find((group) => group.value.model.containsPanel(panel))) === null || _a === void 0 ? void 0 : _a.value;
5525
5610
  }
5526
5611
  dispose() {
5527
- super.dispose();
5528
5612
  this._onDidActivePanelChange.dispose();
5529
5613
  this._onDidAddPanel.dispose();
5530
5614
  this._onDidRemovePanel.dispose();
5531
5615
  this._onDidLayoutFromJSON.dispose();
5616
+ super.dispose();
5532
5617
  }
5533
5618
  }
5534
5619
 
@@ -5786,7 +5871,7 @@ class SplitviewComponent extends Resizable {
5786
5871
  }
5787
5872
  set splitview(value) {
5788
5873
  this._splitview = value;
5789
- this._disposable.value = new CompositeDisposable(this._splitview.onDidSashEnd(() => {
5874
+ this._splitviewChangeDisposable.value = new CompositeDisposable(this._splitview.onDidSashEnd(() => {
5790
5875
  this._onDidLayoutChange.fire(undefined);
5791
5876
  }), this._splitview.onDidAddView((e) => this._onDidAddView.fire(e)), this._splitview.onDidRemoveView((e) => this._onDidRemoveView.fire(e)));
5792
5877
  }
@@ -5808,7 +5893,7 @@ class SplitviewComponent extends Resizable {
5808
5893
  }
5809
5894
  constructor(options) {
5810
5895
  super(options.parentElement);
5811
- this._disposable = new MutableDisposable();
5896
+ this._splitviewChangeDisposable = new MutableDisposable();
5812
5897
  this._panels = new Map();
5813
5898
  this._onDidLayoutfromJSON = new Emitter();
5814
5899
  this.onDidLayoutFromJSON = this._onDidLayoutfromJSON.event;
@@ -5826,7 +5911,7 @@ class SplitviewComponent extends Resizable {
5826
5911
  options.frameworkComponents = {};
5827
5912
  }
5828
5913
  this.splitview = new Splitview(this.element, options);
5829
- this.addDisposables(this._disposable, this._onDidAddView, this._onDidLayoutfromJSON, this._onDidRemoveView, this._onDidLayoutChange);
5914
+ this.addDisposables(this._onDidAddView, this._onDidLayoutfromJSON, this._onDidRemoveView, this._onDidLayoutChange);
5830
5915
  }
5831
5916
  updateOptions(options) {
5832
5917
  const hasOrientationChanged = typeof options.orientation === 'string' &&
@@ -5864,15 +5949,15 @@ class SplitviewComponent extends Resizable {
5864
5949
  }
5865
5950
  }
5866
5951
  removePanel(panel, sizing) {
5867
- const disposable = this._panels.get(panel.id);
5868
- if (!disposable) {
5952
+ const item = this._panels.get(panel.id);
5953
+ if (!item) {
5869
5954
  throw new Error(`unknown splitview panel ${panel.id}`);
5870
5955
  }
5871
- disposable.disposable.dispose();
5872
- disposable.value.dispose();
5956
+ item.dispose();
5873
5957
  this._panels.delete(panel.id);
5874
5958
  const index = this.panels.findIndex((_) => _ === panel);
5875
- this.splitview.removeView(index, sizing);
5959
+ const removedView = this.splitview.removeView(index, sizing);
5960
+ removedView.dispose();
5876
5961
  const panels = this.panels;
5877
5962
  if (panels.length > 0) {
5878
5963
  this.setActive(panels[panels.length - 1]);
@@ -5919,7 +6004,7 @@ class SplitviewComponent extends Resizable {
5919
6004
  }
5920
6005
  this.setActive(view, true);
5921
6006
  });
5922
- this._panels.set(view.id, { disposable, value: view });
6007
+ this._panels.set(view.id, disposable);
5923
6008
  }
5924
6009
  toJSON() {
5925
6010
  var _a;
@@ -5992,20 +6077,26 @@ class SplitviewComponent extends Resizable {
5992
6077
  this._onDidLayoutfromJSON.fire();
5993
6078
  }
5994
6079
  clear() {
5995
- for (const [_, value] of this._panels.entries()) {
5996
- value.disposable.dispose();
5997
- value.value.dispose();
6080
+ for (const disposable of this._panels.values()) {
6081
+ disposable.dispose();
5998
6082
  }
5999
6083
  this._panels.clear();
6000
- this.splitview.dispose();
6084
+ while (this.splitview.length > 0) {
6085
+ const view = this.splitview.removeView(0, Sizing.Distribute, true);
6086
+ view.dispose();
6087
+ }
6001
6088
  }
6002
6089
  dispose() {
6003
- for (const [_, value] of this._panels.entries()) {
6004
- value.disposable.dispose();
6005
- value.value.dispose();
6090
+ for (const disposable of this._panels.values()) {
6091
+ disposable.dispose();
6006
6092
  }
6007
6093
  this._panels.clear();
6094
+ const views = this.splitview.getViews();
6095
+ this._splitviewChangeDisposable.dispose();
6008
6096
  this.splitview.dispose();
6097
+ for (const view of views) {
6098
+ view.dispose();
6099
+ }
6009
6100
  super.dispose();
6010
6101
  }
6011
6102
  }