dockview 1.0.3 → 1.1.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 (209) hide show
  1. package/README.md +243 -186
  2. package/dist/cjs/api/component.api.d.ts +28 -19
  3. package/dist/cjs/api/component.api.js +104 -33
  4. package/dist/cjs/api/component.api.js.map +1 -1
  5. package/dist/cjs/api/gridviewPanelApi.js +1 -0
  6. package/dist/cjs/api/gridviewPanelApi.js.map +1 -1
  7. package/dist/cjs/api/groupPanelApi.d.ts +11 -14
  8. package/dist/cjs/api/groupPanelApi.js +19 -17
  9. package/dist/cjs/api/groupPanelApi.js.map +1 -1
  10. package/dist/cjs/api/panelApi.d.ts +0 -25
  11. package/dist/cjs/api/panelApi.js +1 -20
  12. package/dist/cjs/api/panelApi.js.map +1 -1
  13. package/dist/cjs/api/paneviewPanelApi.js +1 -0
  14. package/dist/cjs/api/paneviewPanelApi.js.map +1 -1
  15. package/dist/cjs/api/splitviewPanelApi.d.ts +0 -1
  16. package/dist/cjs/api/splitviewPanelApi.js +1 -5
  17. package/dist/cjs/api/splitviewPanelApi.js.map +1 -1
  18. package/dist/cjs/dnd/abstractDragHandler.d.ts +3 -3
  19. package/dist/cjs/dnd/abstractDragHandler.js +15 -14
  20. package/dist/cjs/dnd/abstractDragHandler.js.map +1 -1
  21. package/dist/cjs/dnd/dataTransfer.d.ts +0 -25
  22. package/dist/cjs/dnd/dataTransfer.js +1 -45
  23. package/dist/cjs/dnd/dataTransfer.js.map +1 -1
  24. package/dist/cjs/dnd/dnd.d.ts +1 -14
  25. package/dist/cjs/dnd/dnd.js +1 -79
  26. package/dist/cjs/dnd/dnd.js.map +1 -1
  27. package/dist/cjs/dnd/droptarget.d.ts +3 -0
  28. package/dist/cjs/dnd/droptarget.js +69 -45
  29. package/dist/cjs/dnd/droptarget.js.map +1 -1
  30. package/dist/cjs/dockview/components/tab/defaultTab.d.ts +0 -1
  31. package/dist/cjs/dockview/components/tab/defaultTab.js +0 -8
  32. package/dist/cjs/dockview/components/tab/defaultTab.js.map +1 -1
  33. package/dist/cjs/dockview/dockviewComponent.d.ts +27 -19
  34. package/dist/cjs/dockview/dockviewComponent.js +67 -178
  35. package/dist/cjs/dockview/dockviewComponent.js.map +1 -1
  36. package/dist/cjs/dockview/dockviewGroupPanel.d.ts +2 -5
  37. package/dist/cjs/dockview/dockviewGroupPanel.js +2 -31
  38. package/dist/cjs/dockview/dockviewGroupPanel.js.map +1 -1
  39. package/dist/cjs/dockview/options.d.ts +2 -1
  40. package/dist/cjs/events.js +25 -4
  41. package/dist/cjs/events.js.map +1 -1
  42. package/dist/cjs/gridview/baseComponentGridview.d.ts +9 -0
  43. package/dist/cjs/gridview/baseComponentGridview.js +14 -2
  44. package/dist/cjs/gridview/baseComponentGridview.js.map +1 -1
  45. package/dist/cjs/gridview/basePanelView.d.ts +5 -8
  46. package/dist/cjs/gridview/basePanelView.js +14 -8
  47. package/dist/cjs/gridview/basePanelView.js.map +1 -1
  48. package/dist/cjs/gridview/branchNode.js +1 -1
  49. package/dist/cjs/gridview/branchNode.js.map +1 -1
  50. package/dist/cjs/gridview/gridview.js +19 -17
  51. package/dist/cjs/gridview/gridview.js.map +1 -1
  52. package/dist/cjs/gridview/gridviewComponent.d.ts +4 -0
  53. package/dist/cjs/gridview/gridviewComponent.js +5 -0
  54. package/dist/cjs/gridview/gridviewComponent.js.map +1 -1
  55. package/dist/cjs/gridview/gridviewPanel.d.ts +0 -1
  56. package/dist/cjs/gridview/gridviewPanel.js +3 -6
  57. package/dist/cjs/gridview/gridviewPanel.js.map +1 -1
  58. package/dist/cjs/gridview/leafNode.js +1 -0
  59. package/dist/cjs/gridview/leafNode.js.map +1 -1
  60. package/dist/cjs/groupview/groupPanel.d.ts +0 -7
  61. package/dist/cjs/groupview/groupview.d.ts +15 -8
  62. package/dist/cjs/groupview/groupview.js +36 -123
  63. package/dist/cjs/groupview/groupview.js.map +1 -1
  64. package/dist/cjs/groupview/groupviewPanel.d.ts +5 -2
  65. package/dist/cjs/groupview/groupviewPanel.js.map +1 -1
  66. package/dist/cjs/groupview/panel/content.js +1 -0
  67. package/dist/cjs/groupview/panel/content.js.map +1 -1
  68. package/dist/cjs/groupview/tab.d.ts +10 -13
  69. package/dist/cjs/groupview/tab.js +22 -80
  70. package/dist/cjs/groupview/tab.js.map +1 -1
  71. package/dist/cjs/groupview/titlebar/tabsContainer.js +4 -6
  72. package/dist/cjs/groupview/titlebar/tabsContainer.js.map +1 -1
  73. package/dist/cjs/index.d.ts +1 -1
  74. package/dist/cjs/lifecycle.js +2 -1
  75. package/dist/cjs/lifecycle.js.map +1 -1
  76. package/dist/cjs/panel/types.d.ts +0 -2
  77. package/dist/cjs/paneview/draggablePaneviewPanel.d.ts +2 -2
  78. package/dist/cjs/paneview/draggablePaneviewPanel.js +31 -28
  79. package/dist/cjs/paneview/draggablePaneviewPanel.js.map +1 -1
  80. package/dist/cjs/paneview/paneview.js +1 -1
  81. package/dist/cjs/paneview/paneview.js.map +1 -1
  82. package/dist/cjs/paneview/paneviewComponent.d.ts +0 -3
  83. package/dist/cjs/paneview/paneviewComponent.js +1 -0
  84. package/dist/cjs/paneview/paneviewComponent.js.map +1 -1
  85. package/dist/cjs/paneview/paneviewPanel.js +1 -1
  86. package/dist/cjs/paneview/paneviewPanel.js.map +1 -1
  87. package/dist/cjs/react/deserializer.js +1 -3
  88. package/dist/cjs/react/deserializer.js.map +1 -1
  89. package/dist/cjs/react/dockview/dockview.d.ts +9 -9
  90. package/dist/cjs/react/dockview/dockview.js +14 -1
  91. package/dist/cjs/react/dockview/dockview.js.map +1 -1
  92. package/dist/cjs/react/dockview/reactContentPart.js +4 -4
  93. package/dist/cjs/react/dockview/reactContentPart.js.map +1 -1
  94. package/dist/cjs/react/dockview/reactHeaderPart.js +1 -0
  95. package/dist/cjs/react/dockview/reactHeaderPart.js.map +1 -1
  96. package/dist/cjs/react/dockview/reactWatermarkPart.d.ts +1 -2
  97. package/dist/cjs/react/dockview/reactWatermarkPart.js +1 -2
  98. package/dist/cjs/react/dockview/reactWatermarkPart.js.map +1 -1
  99. package/dist/cjs/react/gridview/view.js +2 -2
  100. package/dist/cjs/react/gridview/view.js.map +1 -1
  101. package/dist/cjs/react/index.d.ts +1 -0
  102. package/dist/cjs/react/index.js.map +1 -1
  103. package/dist/cjs/react/react.js +1 -2
  104. package/dist/cjs/react/react.js.map +1 -1
  105. package/dist/cjs/react/splitview/view.js +2 -2
  106. package/dist/cjs/react/splitview/view.js.map +1 -1
  107. package/dist/cjs/splitview/splitviewComponent.d.ts +0 -3
  108. package/dist/cjs/splitview/splitviewComponent.js +1 -1
  109. package/dist/cjs/splitview/splitviewComponent.js.map +1 -1
  110. package/dist/cjs/splitview/splitviewPanel.d.ts +1 -6
  111. package/dist/cjs/splitview/splitviewPanel.js +5 -3
  112. package/dist/cjs/splitview/splitviewPanel.js.map +1 -1
  113. package/dist/dockview.amd.js +394 -532
  114. package/dist/dockview.amd.min.js +2 -16
  115. package/dist/dockview.amd.min.noStyle.js +2 -16
  116. package/dist/dockview.amd.noStyle.js +393 -531
  117. package/dist/dockview.cjs.js +394 -532
  118. package/dist/dockview.esm.js +395 -528
  119. package/dist/dockview.esm.min.js +2 -16
  120. package/dist/dockview.js +394 -532
  121. package/dist/dockview.min.js +2 -16
  122. package/dist/dockview.min.noStyle.js +2 -16
  123. package/dist/dockview.noStyle.js +393 -531
  124. package/dist/esm/api/component.api.d.ts +28 -19
  125. package/dist/esm/api/component.api.js +48 -21
  126. package/dist/esm/api/gridviewPanelApi.js +1 -0
  127. package/dist/esm/api/groupPanelApi.d.ts +11 -14
  128. package/dist/esm/api/groupPanelApi.js +18 -13
  129. package/dist/esm/api/panelApi.d.ts +0 -25
  130. package/dist/esm/api/panelApi.js +1 -20
  131. package/dist/esm/api/paneviewPanelApi.js +1 -0
  132. package/dist/esm/api/splitviewPanelApi.d.ts +0 -1
  133. package/dist/esm/api/splitviewPanelApi.js +1 -5
  134. package/dist/esm/dnd/abstractDragHandler.d.ts +3 -3
  135. package/dist/esm/dnd/abstractDragHandler.js +9 -8
  136. package/dist/esm/dnd/dataTransfer.d.ts +0 -25
  137. package/dist/esm/dnd/dataTransfer.js +0 -40
  138. package/dist/esm/dnd/dnd.d.ts +1 -14
  139. package/dist/esm/dnd/dnd.js +1 -69
  140. package/dist/esm/dnd/droptarget.d.ts +3 -0
  141. package/dist/esm/dnd/droptarget.js +69 -45
  142. package/dist/esm/dockview/components/tab/defaultTab.d.ts +0 -1
  143. package/dist/esm/dockview/components/tab/defaultTab.js +1 -9
  144. package/dist/esm/dockview/dockviewComponent.d.ts +27 -19
  145. package/dist/esm/dockview/dockviewComponent.js +54 -118
  146. package/dist/esm/dockview/dockviewGroupPanel.d.ts +2 -5
  147. package/dist/esm/dockview/dockviewGroupPanel.js +2 -30
  148. package/dist/esm/dockview/options.d.ts +2 -1
  149. package/dist/esm/events.js +2 -3
  150. package/dist/esm/gridview/baseComponentGridview.d.ts +9 -0
  151. package/dist/esm/gridview/baseComponentGridview.js +14 -2
  152. package/dist/esm/gridview/basePanelView.d.ts +5 -8
  153. package/dist/esm/gridview/basePanelView.js +10 -8
  154. package/dist/esm/gridview/branchNode.js +1 -1
  155. package/dist/esm/gridview/gridview.js +16 -15
  156. package/dist/esm/gridview/gridviewComponent.d.ts +4 -0
  157. package/dist/esm/gridview/gridviewComponent.js +5 -0
  158. package/dist/esm/gridview/gridviewPanel.d.ts +0 -1
  159. package/dist/esm/gridview/gridviewPanel.js +3 -6
  160. package/dist/esm/gridview/leafNode.js +1 -0
  161. package/dist/esm/groupview/groupPanel.d.ts +0 -7
  162. package/dist/esm/groupview/groupview.d.ts +15 -8
  163. package/dist/esm/groupview/groupview.js +22 -56
  164. package/dist/esm/groupview/groupviewPanel.d.ts +5 -2
  165. package/dist/esm/groupview/panel/content.js +1 -0
  166. package/dist/esm/groupview/tab.d.ts +10 -13
  167. package/dist/esm/groupview/tab.js +17 -24
  168. package/dist/esm/groupview/titlebar/tabsContainer.js +4 -6
  169. package/dist/esm/index.d.ts +1 -1
  170. package/dist/esm/lifecycle.js +2 -1
  171. package/dist/esm/panel/types.d.ts +0 -2
  172. package/dist/esm/paneview/draggablePaneviewPanel.d.ts +2 -2
  173. package/dist/esm/paneview/draggablePaneviewPanel.js +31 -28
  174. package/dist/esm/paneview/paneview.js +1 -1
  175. package/dist/esm/paneview/paneviewComponent.d.ts +0 -3
  176. package/dist/esm/paneview/paneviewComponent.js +1 -0
  177. package/dist/esm/paneview/paneviewPanel.js +1 -1
  178. package/dist/esm/react/deserializer.js +1 -3
  179. package/dist/esm/react/dockview/dockview.d.ts +9 -9
  180. package/dist/esm/react/dockview/dockview.js +15 -2
  181. package/dist/esm/react/dockview/reactContentPart.js +4 -4
  182. package/dist/esm/react/dockview/reactHeaderPart.js +1 -0
  183. package/dist/esm/react/dockview/reactWatermarkPart.d.ts +1 -2
  184. package/dist/esm/react/dockview/reactWatermarkPart.js +1 -2
  185. package/dist/esm/react/gridview/view.js +2 -2
  186. package/dist/esm/react/index.d.ts +1 -0
  187. package/dist/esm/react/react.js +1 -2
  188. package/dist/esm/react/splitview/view.js +2 -2
  189. package/dist/esm/splitview/splitviewComponent.d.ts +0 -3
  190. package/dist/esm/splitview/splitviewComponent.js +1 -1
  191. package/dist/esm/splitview/splitviewPanel.d.ts +1 -6
  192. package/dist/esm/splitview/splitviewPanel.js +5 -3
  193. package/dist/styles/dockview.css +5 -9
  194. package/package.json +2 -2
  195. package/dist/cjs/functions.d.ts +0 -1
  196. package/dist/cjs/functions.js +0 -42
  197. package/dist/cjs/functions.js.map +0 -1
  198. package/dist/cjs/groupview/panel/hostedPanel.d.ts +0 -22
  199. package/dist/cjs/groupview/panel/hostedPanel.js +0 -57
  200. package/dist/cjs/groupview/panel/hostedPanel.js.map +0 -1
  201. package/dist/cjs/json.d.ts +0 -1
  202. package/dist/cjs/json.js +0 -14
  203. package/dist/cjs/json.js.map +0 -1
  204. package/dist/esm/functions.d.ts +0 -1
  205. package/dist/esm/functions.js +0 -8
  206. package/dist/esm/groupview/panel/hostedPanel.d.ts +0 -22
  207. package/dist/esm/groupview/panel/hostedPanel.js +0 -43
  208. package/dist/esm/json.d.ts +0 -1
  209. package/dist/esm/json.js +0 -9
@@ -1,12 +1,3 @@
1
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
- return new (P || (P = Promise))(function (resolve, reject) {
4
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
- step((generator = generator.apply(thisArg, _arguments || [])).next());
8
- });
9
- };
10
1
  import { getRelativeLocation, getGridLocation, } from '../gridview/gridview';
11
2
  import { Position } from '../dnd/droptarget';
12
3
  import { tail, sequenceEquals } from '../array';
@@ -14,7 +5,6 @@ import { DockviewGroupPanel } from './dockviewGroupPanel';
14
5
  import { CompositeDisposable } from '../lifecycle';
15
6
  import { Emitter } from '../events';
16
7
  import { Watermark } from './components/watermark/watermark';
17
- import { debounce } from '../functions';
18
8
  import { sequentialNumberGenerator } from '../math';
19
9
  import { DefaultDeserializer } from './deserializer';
20
10
  import { createComponent } from '../panel/componentFactory';
@@ -34,15 +24,22 @@ export class DockviewComponent extends BaseGrid {
34
24
  orientation: options.orientation || Orientation.HORIZONTAL,
35
25
  styles: options.styles,
36
26
  });
37
- this._panels = new Map();
38
- this.dirtyPanels = new Set();
39
- this.debouncedDeque = debounce(this.syncConfigs.bind(this), 5000);
40
27
  // events
41
28
  this._onTabInteractionEvent = new Emitter();
42
29
  this.onTabInteractionEvent = this._onTabInteractionEvent.event;
43
30
  this._onTabContextMenu = new Emitter();
44
31
  this.onTabContextMenu = this._onTabContextMenu.event;
45
- this.panelState = {};
32
+ this._onDidDrop = new Emitter();
33
+ this.onDidDrop = this._onDidDrop.event;
34
+ this._onDidRemovePanel = new Emitter();
35
+ this.onDidRemovePanel = this._onDidRemovePanel.event;
36
+ this._onDidAddPanel = new Emitter();
37
+ this.onDidAddPanel = this._onDidAddPanel.event;
38
+ this._onDidLayoutfromJSON = new Emitter();
39
+ this.onDidLayoutfromJSON = this._onDidLayoutfromJSON.event;
40
+ this._onDidActivePanelChange = new Emitter();
41
+ this.onDidActivePanelChange = this._onDidActivePanelChange.event;
42
+ this.addDisposables(this._onTabInteractionEvent, this._onTabContextMenu, this._onDidDrop);
46
43
  this._options = options;
47
44
  if (!this.options.components) {
48
45
  this.options.components = {};
@@ -63,10 +60,10 @@ export class DockviewComponent extends BaseGrid {
63
60
  this._api = new DockviewApi(this);
64
61
  }
65
62
  get totalPanels() {
66
- return this._panels.size;
63
+ return this.panels.length;
67
64
  }
68
65
  get panels() {
69
- return Array.from(this._panels.values()).map((_) => _.value);
66
+ return this.groups.flatMap((group) => group.model.panels);
70
67
  }
71
68
  get deserializer() {
72
69
  return this._deserializer;
@@ -96,10 +93,6 @@ export class DockviewComponent extends BaseGrid {
96
93
  updateOptions(options) {
97
94
  const hasOrientationChanged = typeof options.orientation === 'string' &&
98
95
  this.options.orientation !== options.orientation;
99
- // TODO support style update
100
- // const hasStylesChanged =
101
- // typeof options.styles === 'object' &&
102
- // this.options.styles !== options.styles;
103
96
  this._options = Object.assign(Object.assign({}, this.options), options);
104
97
  if (hasOrientationChanged) {
105
98
  this.gridview.orientation = options.orientation;
@@ -111,8 +104,7 @@ export class DockviewComponent extends BaseGrid {
111
104
  (_a = this.activeGroup) === null || _a === void 0 ? void 0 : _a.focus();
112
105
  }
113
106
  getGroupPanel(id) {
114
- var _a;
115
- return (_a = this._panels.get(id)) === null || _a === void 0 ? void 0 : _a.value;
107
+ return this.panels.find((panel) => panel.id === id);
116
108
  }
117
109
  setActivePanel(panel) {
118
110
  if (!panel.group) {
@@ -161,24 +153,6 @@ export class DockviewComponent extends BaseGrid {
161
153
  this.doSetGroupActive(next);
162
154
  }
163
155
  }
164
- registerPanel(panel) {
165
- if (this._panels.has(panel.id)) {
166
- throw new Error(`panel ${panel.id} already exists`);
167
- }
168
- const disposable = new CompositeDisposable(panel.onDidStateChange(() => this.addDirtyPanel(panel)));
169
- this._panels.set(panel.id, { value: panel, disposable });
170
- }
171
- unregisterPanel(panel) {
172
- if (!this._panels.has(panel.id)) {
173
- throw new Error(`panel ${panel.id} doesn't exist`);
174
- }
175
- const item = this._panels.get(panel.id);
176
- if (item) {
177
- item.disposable.dispose();
178
- item.value.dispose();
179
- }
180
- this._panels.delete(panel.id);
181
- }
182
156
  /**
183
157
  * Serialize the current state of the layout
184
158
  *
@@ -186,12 +160,9 @@ export class DockviewComponent extends BaseGrid {
186
160
  */
187
161
  toJSON() {
188
162
  var _a;
189
- this.syncConfigs();
190
163
  const data = this.gridview.serialize();
191
- const panels = Array.from(this._panels.values()).reduce((collection, panel) => {
192
- if (!this.panelState[panel.value.id]) {
193
- collection[panel.value.id] = panel.value.toJSON();
194
- }
164
+ const panels = this.panels.reduce((collection, panel) => {
165
+ collection[panel.id] = panel.toJSON();
195
166
  return collection;
196
167
  }, {});
197
168
  return {
@@ -203,11 +174,9 @@ export class DockviewComponent extends BaseGrid {
203
174
  }
204
175
  fromJSON(data) {
205
176
  this.gridview.clear();
206
- this._panels.forEach((panel) => {
207
- panel.disposable.dispose();
208
- panel.value.dispose();
177
+ this.panels.forEach((panel) => {
178
+ panel.dispose();
209
179
  });
210
- this._panels.clear();
211
180
  this._groups.clear();
212
181
  if (!this.deserializer) {
213
182
  throw new Error('invalid deserializer');
@@ -222,9 +191,7 @@ export class DockviewComponent extends BaseGrid {
222
191
  this.gridview.deserialize(grid, new DefaultDeserializer(this, {
223
192
  createPanel: (id) => {
224
193
  const panelData = panels[id];
225
- const panel = this.deserializer.fromJSON(panelData);
226
- this.registerPanel(panel);
227
- return panel;
194
+ return this.deserializer.fromJSON(panelData);
228
195
  },
229
196
  }));
230
197
  if (typeof activeGroup === 'string') {
@@ -235,30 +202,23 @@ export class DockviewComponent extends BaseGrid {
235
202
  }
236
203
  this.gridview.layout(this.width, this.height);
237
204
  this._onGridEvent.fire({ kind: GroupChangeKind.LAYOUT_FROM_JSON });
205
+ this._onDidLayoutfromJSON.fire();
238
206
  }
239
207
  closeAllGroups() {
240
- return __awaiter(this, void 0, void 0, function* () {
241
- for (const entry of this._groups.entries()) {
242
- const [_, group] = entry;
243
- const didCloseAll = yield group.value.model.closeAllPanels();
244
- if (!didCloseAll) {
245
- return false;
246
- }
247
- }
248
- return true;
249
- });
208
+ for (const entry of this._groups.entries()) {
209
+ const [_, group] = entry;
210
+ group.value.model.closeAllPanels();
211
+ }
250
212
  }
251
213
  fireMouseEvent(event) {
252
- switch (event.kind) {
253
- case MouseEventKind.CONTEXT_MENU:
254
- if (event.tab && event.panel) {
255
- this._onTabContextMenu.fire({
256
- event: event.event,
257
- api: this._api,
258
- panel: event.panel,
259
- });
260
- }
261
- break;
214
+ if (event.kind === MouseEventKind.CONTEXT_MENU) {
215
+ if (event.tab && event.panel) {
216
+ this._onTabContextMenu.fire({
217
+ event: event.event,
218
+ api: this._api,
219
+ panel: event.panel,
220
+ });
221
+ }
262
222
  }
263
223
  }
264
224
  addPanel(options) {
@@ -292,7 +252,6 @@ export class DockviewComponent extends BaseGrid {
292
252
  return panel;
293
253
  }
294
254
  removePanel(panel) {
295
- this.unregisterPanel(panel);
296
255
  const group = panel.group;
297
256
  if (!group) {
298
257
  throw new Error(`cannot remove panel ${panel.id}. it's missing a group.`);
@@ -311,10 +270,9 @@ export class DockviewComponent extends BaseGrid {
311
270
  : {}, (_a = this.options.frameworkComponentFactory) === null || _a === void 0 ? void 0 : _a.watermark);
312
271
  }
313
272
  addEmptyGroup(options) {
314
- var _a;
315
273
  const group = this.createGroup();
316
274
  if (options) {
317
- const referencePanel = (_a = this._panels.get(options.referencePanel)) === null || _a === void 0 ? void 0 : _a.value;
275
+ const referencePanel = this.panels.find((panel) => panel.id === options.referencePanel);
318
276
  if (!referencePanel) {
319
277
  throw new Error(`reference panel ${options.referencePanel} does not exist`);
320
278
  }
@@ -343,13 +301,13 @@ export class DockviewComponent extends BaseGrid {
343
301
  super.removeGroup(group);
344
302
  }
345
303
  moveGroupOrPanel(referenceGroup, groupId, itemId, target, index) {
346
- var _a, _b, _c;
304
+ var _a;
347
305
  const sourceGroup = groupId
348
306
  ? (_a = this._groups.get(groupId)) === null || _a === void 0 ? void 0 : _a.value
349
307
  : undefined;
350
308
  if (!target || target === Position.Center) {
351
309
  const groupItem = (sourceGroup === null || sourceGroup === void 0 ? void 0 : sourceGroup.model.removePanel(itemId)) ||
352
- ((_b = this._panels.get(itemId)) === null || _b === void 0 ? void 0 : _b.value);
310
+ this.panels.find((panel) => panel.id === itemId);
353
311
  if (!groupItem) {
354
312
  throw new Error(`No panel with id ${itemId}`);
355
313
  }
@@ -385,7 +343,7 @@ export class DockviewComponent extends BaseGrid {
385
343
  }
386
344
  else {
387
345
  const groupItem = (sourceGroup === null || sourceGroup === void 0 ? void 0 : sourceGroup.model.removePanel(itemId)) ||
388
- ((_c = this._panels.get(itemId)) === null || _c === void 0 ? void 0 : _c.value);
346
+ this.panels.find((panel) => panel.id === itemId);
389
347
  if (!groupItem) {
390
348
  throw new Error(`No panel with id ${itemId}`);
391
349
  }
@@ -395,7 +353,7 @@ export class DockviewComponent extends BaseGrid {
395
353
  }
396
354
  }
397
355
  doSetGroupActive(group, skipFocus) {
398
- var _a, _b;
356
+ var _a, _b, _c;
399
357
  const isGroupAlreadyFocused = this._activeGroup === group;
400
358
  super.doSetGroupActive(group, skipFocus);
401
359
  if (!isGroupAlreadyFocused && ((_a = this._activeGroup) === null || _a === void 0 ? void 0 : _a.model.activePanel)) {
@@ -403,6 +361,7 @@ export class DockviewComponent extends BaseGrid {
403
361
  kind: GroupChangeKind.PANEL_ACTIVE,
404
362
  panel: (_b = this._activeGroup) === null || _b === void 0 ? void 0 : _b.model.activePanel,
405
363
  });
364
+ this._onDidActivePanelChange.fire((_c = this._activeGroup) === null || _c === void 0 ? void 0 : _c.model.activePanel);
406
365
  }
407
366
  }
408
367
  createGroup(options) {
@@ -428,6 +387,8 @@ export class DockviewComponent extends BaseGrid {
428
387
  const disposable = new CompositeDisposable(view.model.onMove((event) => {
429
388
  const { groupId, itemId, target, index } = event;
430
389
  this.moveGroupOrPanel(view, groupId, itemId, target, index);
390
+ }), view.model.onDidDrop((event) => {
391
+ this._onDidDrop.fire(Object.assign(Object.assign({}, event), { api: this._api }));
431
392
  }), view.model.onDidGroupChange((event) => {
432
393
  switch (event.kind) {
433
394
  case GroupChangeKind2.ADD_PANEL:
@@ -435,24 +396,25 @@ export class DockviewComponent extends BaseGrid {
435
396
  kind: GroupChangeKind.ADD_PANEL,
436
397
  panel: event.panel,
437
398
  });
438
- break;
439
- case GroupChangeKind2.GROUP_ACTIVE:
440
- this._onGridEvent.fire({
441
- kind: GroupChangeKind.GROUP_ACTIVE,
442
- panel: event.panel,
443
- });
399
+ if (event.panel) {
400
+ this._onDidAddPanel.fire(event.panel);
401
+ }
444
402
  break;
445
403
  case GroupChangeKind2.REMOVE_PANEL:
446
404
  this._onGridEvent.fire({
447
405
  kind: GroupChangeKind.REMOVE_PANEL,
448
406
  panel: event.panel,
449
407
  });
408
+ if (event.panel) {
409
+ this._onDidRemovePanel.fire(event.panel);
410
+ }
450
411
  break;
451
412
  case GroupChangeKind2.PANEL_ACTIVE:
452
413
  this._onGridEvent.fire({
453
414
  kind: GroupChangeKind.PANEL_ACTIVE,
454
415
  panel: event.panel,
455
416
  });
417
+ this._onDidActivePanelChange.fire(event.panel);
456
418
  break;
457
419
  }
458
420
  }));
@@ -466,46 +428,18 @@ export class DockviewComponent extends BaseGrid {
466
428
  }
467
429
  return view;
468
430
  }
469
- dispose() {
470
- super.dispose();
471
- this._onGridEvent.dispose();
472
- }
473
- /**
474
- * Ensure the local copy of the layout state is up-to-date
475
- */
476
- syncConfigs() {
477
- const dirtyPanels = Array.from(this.dirtyPanels);
478
- if (dirtyPanels.length === 0) {
479
- //
480
- }
481
- this.dirtyPanels.clear();
482
- const partialPanelState = dirtyPanels
483
- .map((panel) => this._panels.get(panel.id))
484
- .filter((_) => !!_)
485
- .reduce((collection, panel) => {
486
- collection[panel.value.id] = panel.value.toJSON();
487
- return collection;
488
- }, {});
489
- this.panelState = Object.assign(Object.assign({}, this.panelState), partialPanelState);
490
- dirtyPanels
491
- .filter((p) => this._panels.has(p.id))
492
- .forEach((panel) => {
493
- panel.setDirty(false);
494
- });
495
- }
496
431
  _addPanel(options) {
497
432
  const view = new DefaultGroupPanelView({
498
433
  content: this.createContentComponent(options.id, options.component),
499
434
  tab: this.createTabComponent(options.id, options.tabComponent),
500
435
  });
501
- const panel = new DockviewGroupPanel(options.id, this._api);
436
+ const panel = new DockviewGroupPanel(options.id, this, this._api);
502
437
  panel.init({
503
438
  view,
504
439
  title: options.title || options.id,
505
440
  suppressClosable: options === null || options === void 0 ? void 0 : options.suppressClosable,
506
441
  params: (options === null || options === void 0 ? void 0 : options.params) || {},
507
442
  });
508
- this.registerPanel(panel);
509
443
  return panel;
510
444
  }
511
445
  createContentComponent(id, componentName) {
@@ -525,9 +459,11 @@ export class DockviewComponent extends BaseGrid {
525
459
  var _a;
526
460
  return (_a = Array.from(this._groups.values()).find((group) => group.value.model.containsPanel(panel))) === null || _a === void 0 ? void 0 : _a.value;
527
461
  }
528
- addDirtyPanel(panel) {
529
- this.dirtyPanels.add(panel);
530
- panel.setDirty(true);
531
- this.debouncedDeque();
462
+ dispose() {
463
+ super.dispose();
464
+ this._onDidActivePanelChange.dispose();
465
+ this._onDidAddPanel.dispose();
466
+ this._onDidRemovePanel.dispose();
467
+ this._onDidLayoutfromJSON.dispose();
532
468
  }
533
469
  }
@@ -1,10 +1,10 @@
1
1
  import { DockviewApi } from '../api/component.api';
2
2
  import { DockviewPanelApiImpl } from '../api/groupPanelApi';
3
- import { Event } from '../events';
4
3
  import { GroupPanelUpdateEvent, GroupviewPanelState, IGroupPanel, IGroupPanelInitParameters } from '../groupview/groupPanel';
5
4
  import { GroupviewPanel } from '../groupview/groupviewPanel';
6
5
  import { CompositeDisposable } from '../lifecycle';
7
6
  import { IGroupPanelView } from './defaultGroupPanelView';
7
+ import { DockviewComponent } from './dockviewComponent';
8
8
  export declare class DockviewGroupPanel extends CompositeDisposable implements IGroupPanel {
9
9
  readonly id: string;
10
10
  private readonly containerApi;
@@ -12,7 +12,6 @@ export declare class DockviewGroupPanel extends CompositeDisposable implements I
12
12
  readonly api: DockviewPanelApiImpl;
13
13
  private _group;
14
14
  private _params?;
15
- readonly onDidStateChange: Event<void>;
16
15
  private _view?;
17
16
  private _title;
18
17
  private _suppressClosable;
@@ -20,11 +19,9 @@ export declare class DockviewGroupPanel extends CompositeDisposable implements I
20
19
  get suppressClosable(): boolean;
21
20
  get group(): GroupviewPanel | undefined;
22
21
  get view(): IGroupPanelView | undefined;
23
- constructor(id: string, containerApi: DockviewApi);
22
+ constructor(id: string, accessor: DockviewComponent, containerApi: DockviewApi);
24
23
  init(params: IGroupPanelInitParameters): void;
25
24
  focus(): void;
26
- setDirty(isDirty: boolean): void;
27
- close(): Promise<boolean>;
28
25
  toJSON(): GroupviewPanelState;
29
26
  setTitle(title: string): void;
30
27
  setSuppressClosable(suppressClosable: boolean): void;
@@ -1,8 +1,7 @@
1
- import { GroupChangeKind2 } from '../groupview/groupview';
2
1
  import { DockviewPanelApiImpl } from '../api/groupPanelApi';
3
2
  import { CompositeDisposable, MutableDisposable } from '../lifecycle';
4
3
  export class DockviewGroupPanel extends CompositeDisposable {
5
- constructor(id, containerApi) {
4
+ constructor(id, accessor, containerApi) {
6
5
  super();
7
6
  this.id = id;
8
7
  this.containerApi = containerApi;
@@ -10,9 +9,8 @@ export class DockviewGroupPanel extends CompositeDisposable {
10
9
  this._suppressClosable = false;
11
10
  this._title = '';
12
11
  this.api = new DockviewPanelApiImpl(this, this._group);
13
- this.onDidStateChange = this.api.onDidStateChange;
14
12
  this.addDisposables(this.api.onActiveChange(() => {
15
- this.containerApi.setActivePanel(this);
13
+ accessor.setActivePanel(this);
16
14
  }), this.api.onDidTitleChange((event) => {
17
15
  const title = event.title;
18
16
  this.update({ params: { title } });
@@ -36,32 +34,18 @@ export class DockviewGroupPanel extends CompositeDisposable {
36
34
  this._view = params.view;
37
35
  this.setTitle(params.title);
38
36
  this.setSuppressClosable(params.suppressClosable || false);
39
- if (params.state) {
40
- this.api.setState(params.state);
41
- }
42
37
  (_a = this.view) === null || _a === void 0 ? void 0 : _a.init(Object.assign(Object.assign({}, params), { api: this.api, containerApi: this.containerApi }));
43
38
  }
44
39
  focus() {
45
40
  this.api._onFocusEvent.fire();
46
41
  }
47
- setDirty(isDirty) {
48
- this.api._onDidDirtyChange.fire(isDirty);
49
- }
50
- close() {
51
- if (this.api.tryClose) {
52
- return this.api.tryClose();
53
- }
54
- return Promise.resolve(true);
55
- }
56
42
  toJSON() {
57
- const state = this.api.getState();
58
43
  return {
59
44
  id: this.id,
60
45
  view: this.view.toJSON(),
61
46
  params: Object.keys(this._params || {}).length > 0
62
47
  ? this._params
63
48
  : undefined,
64
- state: state && Object.keys(state).length > 0 ? state : undefined,
65
49
  suppressClosable: this.suppressClosable || undefined,
66
50
  title: this.title,
67
51
  };
@@ -106,18 +90,6 @@ export class DockviewGroupPanel extends CompositeDisposable {
106
90
  var _a;
107
91
  this._group = group;
108
92
  this.api.group = group;
109
- this.mutableDisposable.value = this._group.model.onDidGroupChange((ev) => {
110
- var _a;
111
- if (ev.kind === GroupChangeKind2.GROUP_ACTIVE) {
112
- const isVisible = !!((_a = this._group) === null || _a === void 0 ? void 0 : _a.model.isPanelActive(this));
113
- this.api._onDidActiveChange.fire({
114
- isActive: isGroupActive && isVisible,
115
- });
116
- this.api._onDidVisibilityChange.fire({
117
- isVisible,
118
- });
119
- }
120
- });
121
93
  const isPanelVisible = this._group.model.isPanelActive(this);
122
94
  this.api._onDidActiveChange.fire({
123
95
  isActive: isGroupActive && isPanelVisible,
@@ -6,6 +6,7 @@ import { IContentRenderer, ITabRenderer, WatermarkConstructor, IWatermarkRendere
6
6
  import { GroupviewPanel } from '../groupview/groupviewPanel';
7
7
  import { ISplitviewStyles, Orientation } from '../splitview/core/splitview';
8
8
  import { FrameworkFactory } from '../types';
9
+ import { DockviewDropTargets } from '../groupview/dnd';
9
10
  export interface GroupPanelFrameworkComponentFactory {
10
11
  content: FrameworkFactory<IContentRenderer>;
11
12
  tab: FrameworkFactory<ITabRenderer>;
@@ -44,9 +45,9 @@ export interface DockviewOptions extends DockviewRenderFunctions {
44
45
  frameworkComponentFactory?: GroupPanelFrameworkComponentFactory;
45
46
  tabHeight?: number;
46
47
  debug?: boolean;
47
- enableExternalDragEvents?: boolean;
48
48
  orientation?: Orientation;
49
49
  styles?: ISplitviewStyles;
50
+ showDndOverlay?: (event: DragEvent, target: DockviewDropTargets) => boolean;
50
51
  }
51
52
  export interface PanelOptions {
52
53
  component: string;
@@ -28,7 +28,6 @@ export class Emitter {
28
28
  if (((_a = this.options) === null || _a === void 0 ? void 0 : _a.replay) && this._last !== undefined) {
29
29
  listener(this._last);
30
30
  }
31
- const firstListener = this._listeners.length === 0;
32
31
  this._listeners.push(listener);
33
32
  return {
34
33
  dispose: () => {
@@ -44,9 +43,9 @@ export class Emitter {
44
43
  }
45
44
  fire(e) {
46
45
  this._last = e;
47
- this._listeners.forEach((listener) => {
46
+ for (const listener of this._listeners) {
48
47
  listener(e);
49
- });
48
+ }
50
49
  }
51
50
  dispose() {
52
51
  this._listeners = [];
@@ -45,6 +45,9 @@ export interface IBaseGrid<T extends IGridPanelView> {
45
45
  readonly groups: T[];
46
46
  readonly onGridEvent: Event<GroupChangeEvent>;
47
47
  readonly onDidLayoutChange: Event<void>;
48
+ readonly onDidRemoveGroup: Event<T>;
49
+ readonly onDidAddGroup: Event<T>;
50
+ readonly onDidActiveGroupChange: Event<T | undefined>;
48
51
  getPanel(id: string): T | undefined;
49
52
  toJSON(): object;
50
53
  fromJSON(data: any): void;
@@ -63,6 +66,12 @@ export declare abstract class BaseGrid<T extends IGridPanelView> extends Composi
63
66
  readonly onGridEvent: Event<GroupChangeEvent>;
64
67
  private _onDidLayoutChange;
65
68
  readonly onDidLayoutChange: Event<void>;
69
+ private readonly _onDidRemoveGroup;
70
+ readonly onDidRemoveGroup: Event<T>;
71
+ private readonly _onDidAddGroup;
72
+ readonly onDidAddGroup: Event<T>;
73
+ private readonly _onDidActiveGroupChange;
74
+ readonly onDidActiveGroupChange: Event<T | undefined>;
66
75
  get id(): string;
67
76
  get element(): HTMLElement;
68
77
  get size(): number;
@@ -44,10 +44,15 @@ export class BaseGrid extends CompositeDisposable {
44
44
  this.onGridEvent = this._onGridEvent.event;
45
45
  this._onDidLayoutChange = new Emitter();
46
46
  this.onDidLayoutChange = this._onDidLayoutChange.event;
47
+ this._onDidRemoveGroup = new Emitter();
48
+ this.onDidRemoveGroup = this._onDidRemoveGroup.event;
49
+ this._onDidAddGroup = new Emitter();
50
+ this.onDidAddGroup = this._onDidAddGroup.event;
51
+ this._onDidActiveGroupChange = new Emitter();
52
+ this.onDidActiveGroupChange = this._onDidActiveGroupChange.event;
47
53
  this.gridview = new Gridview(!!options.proportionalLayout, options.styles, options.orientation);
48
54
  this.element.appendChild(this.gridview.element);
49
- // TODO for some reason this is required before anything will layout correctly
50
- this.layout(0, 0, true);
55
+ this.layout(0, 0, true); // set some elements height/widths
51
56
  this.addDisposables(this.gridview.onDidChange(() => {
52
57
  this._onGridEvent.fire({ kind: GroupChangeKind.LAYOUT });
53
58
  }));
@@ -113,6 +118,7 @@ export class BaseGrid extends CompositeDisposable {
113
118
  doAddGroup(group, location = [0], size) {
114
119
  this.gridview.addView(group, size !== null && size !== void 0 ? size : Sizing.Distribute, location);
115
120
  this._onGridEvent.fire({ kind: GroupChangeKind.ADD_GROUP });
121
+ this._onDidAddGroup.fire(group);
116
122
  this.doSetGroupActive(group);
117
123
  }
118
124
  doRemoveGroup(group, options) {
@@ -126,6 +132,7 @@ export class BaseGrid extends CompositeDisposable {
126
132
  this._groups.delete(group.id);
127
133
  }
128
134
  this._onGridEvent.fire({ kind: GroupChangeKind.REMOVE_GROUP });
135
+ this._onDidRemoveGroup.fire(group);
129
136
  if (!(options === null || options === void 0 ? void 0 : options.skipActive) && this._activeGroup === group) {
130
137
  const groups = Array.from(this._groups.values());
131
138
  this.doSetGroupActive(groups.length > 0 ? groups[0].value : undefined);
@@ -156,6 +163,7 @@ export class BaseGrid extends CompositeDisposable {
156
163
  this._onGridEvent.fire({
157
164
  kind: GroupChangeKind.GROUP_ACTIVE,
158
165
  });
166
+ this._onDidActiveGroupChange.fire(group);
159
167
  }
160
168
  removeGroup(group) {
161
169
  this.doRemoveGroup(group);
@@ -212,6 +220,10 @@ export class BaseGrid extends CompositeDisposable {
212
220
  dispose() {
213
221
  super.dispose();
214
222
  this._onGridEvent.dispose();
223
+ this._onDidActiveGroupChange.dispose();
224
+ this._onDidAddGroup.dispose();
225
+ this._onDidRemoveGroup.dispose();
226
+ this._onDidLayoutChange.dispose();
215
227
  this.gridview.dispose();
216
228
  }
217
229
  }
@@ -4,21 +4,17 @@ import { PanelApiImpl } from '../api/panelApi';
4
4
  export interface BasePanelViewState {
5
5
  id: string;
6
6
  component: string;
7
- params?: {
8
- [key: string]: any;
9
- };
10
- state?: {
11
- [key: string]: any;
12
- };
7
+ params?: Record<string, any>;
13
8
  }
14
9
  export interface BasePanelViewExported<T extends PanelApiImpl> {
15
10
  readonly id: string;
16
11
  readonly api: T;
17
12
  readonly width: number;
18
13
  readonly height: number;
14
+ readonly params: Record<string, any> | undefined;
19
15
  focus(): void;
20
16
  toJSON(): object;
21
- update(params: PanelUpdateEvent): void;
17
+ update(event: PanelUpdateEvent): void;
22
18
  }
23
19
  export declare abstract class BasePanelView<T extends PanelApiImpl> extends CompositeDisposable implements IPanel, BasePanelViewExported<T> {
24
20
  readonly id: string;
@@ -28,7 +24,7 @@ export declare abstract class BasePanelView<T extends PanelApiImpl> extends Comp
28
24
  private _width;
29
25
  private _element;
30
26
  protected part?: IFrameworkPart;
31
- protected params?: PanelInitParameters;
27
+ protected _params?: PanelInitParameters;
32
28
  /**
33
29
  * Provide an IFrameworkPart that will determine the rendered UI of this view piece.
34
30
  */
@@ -36,6 +32,7 @@ export declare abstract class BasePanelView<T extends PanelApiImpl> extends Comp
36
32
  get element(): HTMLElement;
37
33
  get width(): number;
38
34
  get height(): number;
35
+ get params(): Record<string, any> | undefined;
39
36
  constructor(id: string, component: string, api: T);
40
37
  focus(): void;
41
38
  layout(width: number, height: number): void;
@@ -30,6 +30,10 @@ export class BasePanelView extends CompositeDisposable {
30
30
  get height() {
31
31
  return this._height;
32
32
  }
33
+ get params() {
34
+ var _a;
35
+ return (_a = this._params) === null || _a === void 0 ? void 0 : _a.params;
36
+ }
33
37
  focus() {
34
38
  this.api._onFocusEvent.fire();
35
39
  }
@@ -38,29 +42,27 @@ export class BasePanelView extends CompositeDisposable {
38
42
  this._height = height;
39
43
  this.api._onDidPanelDimensionChange.fire({ width, height });
40
44
  if (this.part) {
41
- if (this.params) {
42
- this.part.update(this.params.params);
45
+ if (this._params) {
46
+ this.part.update(this._params.params);
43
47
  }
44
48
  }
45
49
  }
46
50
  init(parameters) {
47
- this.params = parameters;
51
+ this._params = parameters;
48
52
  this.part = this.getComponent();
49
53
  }
50
54
  update(event) {
51
55
  var _a, _b;
52
- 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) });
53
- (_b = this.part) === null || _b === void 0 ? void 0 : _b.update({ params: this.params.params });
56
+ 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) });
57
+ (_b = this.part) === null || _b === void 0 ? void 0 : _b.update({ params: this._params.params });
54
58
  }
55
59
  toJSON() {
56
60
  var _a, _b;
57
- const state = this.api.getState();
58
- const params = (_b = (_a = this.params) === null || _a === void 0 ? void 0 : _a.params) !== null && _b !== void 0 ? _b : {};
61
+ const params = (_b = (_a = this._params) === null || _a === void 0 ? void 0 : _a.params) !== null && _b !== void 0 ? _b : {};
59
62
  return {
60
63
  id: this.id,
61
64
  component: this.component,
62
65
  params: Object.keys(params).length > 0 ? params : undefined,
63
- state: Object.keys(state).length === 0 ? undefined : state,
64
66
  };
65
67
  }
66
68
  dispose() {
@@ -49,7 +49,7 @@ export class BranchNode extends CompositeDisposable {
49
49
  proportionalLayout,
50
50
  });
51
51
  }
52
- this.addDisposables(this.splitview.onDidSashEnd(() => {
52
+ this.addDisposables(this._onDidChange, this.splitview.onDidSashEnd(() => {
53
53
  this._onDidChange.fire(undefined);
54
54
  }));
55
55
  this.setupChildrenEvents();