dockview 1.0.2 → 1.2.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 (229) hide show
  1. package/README.md +243 -186
  2. package/dist/cjs/api/component.api.d.ts +32 -23
  3. package/dist/cjs/api/component.api.js +105 -34
  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 +2 -2
  19. package/dist/cjs/dnd/abstractDragHandler.js +14 -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/deserializer.js.map +1 -1
  34. package/dist/cjs/dockview/dockviewComponent.d.ts +31 -21
  35. package/dist/cjs/dockview/dockviewComponent.js +103 -207
  36. package/dist/cjs/dockview/dockviewComponent.js.map +1 -1
  37. package/dist/cjs/dockview/dockviewGroupPanel.d.ts +3 -5
  38. package/dist/cjs/dockview/dockviewGroupPanel.js +10 -31
  39. package/dist/cjs/dockview/dockviewGroupPanel.js.map +1 -1
  40. package/dist/cjs/dockview/options.d.ts +2 -1
  41. package/dist/cjs/events.js +25 -4
  42. package/dist/cjs/events.js.map +1 -1
  43. package/dist/cjs/gridview/baseComponentGridview.d.ts +12 -20
  44. package/dist/cjs/gridview/baseComponentGridview.js +23 -45
  45. package/dist/cjs/gridview/baseComponentGridview.js.map +1 -1
  46. package/dist/cjs/gridview/basePanelView.d.ts +5 -8
  47. package/dist/cjs/gridview/basePanelView.js +14 -8
  48. package/dist/cjs/gridview/basePanelView.js.map +1 -1
  49. package/dist/cjs/gridview/branchNode.js +2 -2
  50. package/dist/cjs/gridview/branchNode.js.map +1 -1
  51. package/dist/cjs/gridview/gridview.js +20 -17
  52. package/dist/cjs/gridview/gridview.js.map +1 -1
  53. package/dist/cjs/gridview/gridviewComponent.d.ts +4 -0
  54. package/dist/cjs/gridview/gridviewComponent.js +5 -1
  55. package/dist/cjs/gridview/gridviewComponent.js.map +1 -1
  56. package/dist/cjs/gridview/gridviewPanel.d.ts +0 -1
  57. package/dist/cjs/gridview/gridviewPanel.js +3 -6
  58. package/dist/cjs/gridview/gridviewPanel.js.map +1 -1
  59. package/dist/cjs/gridview/leafNode.js +2 -1
  60. package/dist/cjs/gridview/leafNode.js.map +1 -1
  61. package/dist/cjs/groupview/groupPanel.d.ts +1 -7
  62. package/dist/cjs/groupview/groupview.d.ts +15 -8
  63. package/dist/cjs/groupview/groupview.js +36 -123
  64. package/dist/cjs/groupview/groupview.js.map +1 -1
  65. package/dist/cjs/groupview/groupviewPanel.d.ts +5 -2
  66. package/dist/cjs/groupview/groupviewPanel.js.map +1 -1
  67. package/dist/cjs/groupview/panel/content.js +1 -0
  68. package/dist/cjs/groupview/panel/content.js.map +1 -1
  69. package/dist/cjs/groupview/tab.d.ts +10 -13
  70. package/dist/cjs/groupview/tab.js +22 -80
  71. package/dist/cjs/groupview/tab.js.map +1 -1
  72. package/dist/cjs/groupview/titlebar/tabsContainer.js +4 -6
  73. package/dist/cjs/groupview/titlebar/tabsContainer.js.map +1 -1
  74. package/dist/cjs/index.d.ts +3 -3
  75. package/dist/cjs/index.js +8 -4
  76. package/dist/cjs/index.js.map +1 -1
  77. package/dist/cjs/lifecycle.js +2 -1
  78. package/dist/cjs/lifecycle.js.map +1 -1
  79. package/dist/cjs/panel/types.d.ts +0 -2
  80. package/dist/cjs/paneview/draggablePaneviewPanel.d.ts +2 -2
  81. package/dist/cjs/paneview/draggablePaneviewPanel.js +32 -29
  82. package/dist/cjs/paneview/draggablePaneviewPanel.js.map +1 -1
  83. package/dist/cjs/paneview/paneview.js +4 -3
  84. package/dist/cjs/paneview/paneview.js.map +1 -1
  85. package/dist/cjs/paneview/paneviewComponent.d.ts +5 -5
  86. package/dist/cjs/paneview/paneviewComponent.js +15 -16
  87. package/dist/cjs/paneview/paneviewComponent.js.map +1 -1
  88. package/dist/cjs/paneview/paneviewPanel.d.ts +5 -1
  89. package/dist/cjs/paneview/paneviewPanel.js +14 -2
  90. package/dist/cjs/paneview/paneviewPanel.js.map +1 -1
  91. package/dist/cjs/react/deserializer.js +1 -3
  92. package/dist/cjs/react/deserializer.js.map +1 -1
  93. package/dist/cjs/react/dockview/components.js +5 -1
  94. package/dist/cjs/react/dockview/components.js.map +1 -1
  95. package/dist/cjs/react/dockview/dockview.d.ts +9 -9
  96. package/dist/cjs/react/dockview/dockview.js +28 -2
  97. package/dist/cjs/react/dockview/dockview.js.map +1 -1
  98. package/dist/cjs/react/dockview/reactContentPart.js +4 -4
  99. package/dist/cjs/react/dockview/reactContentPart.js.map +1 -1
  100. package/dist/cjs/react/dockview/reactHeaderPart.js +1 -0
  101. package/dist/cjs/react/dockview/reactHeaderPart.js.map +1 -1
  102. package/dist/cjs/react/dockview/reactWatermarkPart.d.ts +1 -2
  103. package/dist/cjs/react/dockview/reactWatermarkPart.js +1 -2
  104. package/dist/cjs/react/dockview/reactWatermarkPart.js.map +1 -1
  105. package/dist/cjs/react/gridview/gridview.js +9 -2
  106. package/dist/cjs/react/gridview/gridview.js.map +1 -1
  107. package/dist/cjs/react/gridview/view.js +2 -2
  108. package/dist/cjs/react/gridview/view.js.map +1 -1
  109. package/dist/cjs/react/index.d.ts +1 -0
  110. package/dist/cjs/react/index.js +5 -1
  111. package/dist/cjs/react/index.js.map +1 -1
  112. package/dist/cjs/react/paneview/paneview.js +5 -1
  113. package/dist/cjs/react/paneview/paneview.js.map +1 -1
  114. package/dist/cjs/react/react.js +6 -3
  115. package/dist/cjs/react/react.js.map +1 -1
  116. package/dist/cjs/react/splitview/splitview.js +8 -2
  117. package/dist/cjs/react/splitview/splitview.js.map +1 -1
  118. package/dist/cjs/react/splitview/view.js +2 -2
  119. package/dist/cjs/react/splitview/view.js.map +1 -1
  120. package/dist/cjs/splitview/core/splitview.js +2 -2
  121. package/dist/cjs/splitview/core/splitview.js.map +1 -1
  122. package/dist/cjs/splitview/splitviewComponent.d.ts +9 -6
  123. package/dist/cjs/splitview/splitviewComponent.js +12 -1
  124. package/dist/cjs/splitview/splitviewComponent.js.map +1 -1
  125. package/dist/cjs/splitview/splitviewPanel.d.ts +1 -6
  126. package/dist/cjs/splitview/splitviewPanel.js +5 -3
  127. package/dist/cjs/splitview/splitviewPanel.js.map +1 -1
  128. package/dist/dockview.amd.js +592 -745
  129. package/dist/dockview.amd.min.js +2 -16
  130. package/dist/dockview.amd.min.noStyle.js +2 -16
  131. package/dist/dockview.amd.noStyle.js +591 -744
  132. package/dist/dockview.cjs.js +592 -745
  133. package/dist/dockview.esm.js +592 -734
  134. package/dist/dockview.esm.min.js +2 -16
  135. package/dist/dockview.js +592 -745
  136. package/dist/dockview.min.js +2 -16
  137. package/dist/dockview.min.noStyle.js +2 -16
  138. package/dist/dockview.noStyle.js +591 -744
  139. package/dist/esm/api/component.api.d.ts +32 -23
  140. package/dist/esm/api/component.api.js +51 -24
  141. package/dist/esm/api/gridviewPanelApi.js +1 -0
  142. package/dist/esm/api/groupPanelApi.d.ts +11 -14
  143. package/dist/esm/api/groupPanelApi.js +18 -13
  144. package/dist/esm/api/panelApi.d.ts +0 -25
  145. package/dist/esm/api/panelApi.js +1 -20
  146. package/dist/esm/api/paneviewPanelApi.js +1 -0
  147. package/dist/esm/api/splitviewPanelApi.d.ts +0 -1
  148. package/dist/esm/api/splitviewPanelApi.js +1 -5
  149. package/dist/esm/dnd/abstractDragHandler.d.ts +2 -2
  150. package/dist/esm/dnd/abstractDragHandler.js +9 -9
  151. package/dist/esm/dnd/dataTransfer.d.ts +0 -25
  152. package/dist/esm/dnd/dataTransfer.js +0 -40
  153. package/dist/esm/dnd/dnd.d.ts +1 -14
  154. package/dist/esm/dnd/dnd.js +1 -69
  155. package/dist/esm/dnd/droptarget.d.ts +3 -0
  156. package/dist/esm/dnd/droptarget.js +69 -45
  157. package/dist/esm/dockview/components/tab/defaultTab.d.ts +0 -1
  158. package/dist/esm/dockview/components/tab/defaultTab.js +1 -9
  159. package/dist/esm/dockview/dockviewComponent.d.ts +31 -21
  160. package/dist/esm/dockview/dockviewComponent.js +68 -148
  161. package/dist/esm/dockview/dockviewGroupPanel.d.ts +3 -5
  162. package/dist/esm/dockview/dockviewGroupPanel.js +6 -30
  163. package/dist/esm/dockview/options.d.ts +2 -1
  164. package/dist/esm/events.js +2 -3
  165. package/dist/esm/gridview/baseComponentGridview.d.ts +12 -20
  166. package/dist/esm/gridview/baseComponentGridview.js +23 -45
  167. package/dist/esm/gridview/basePanelView.d.ts +5 -8
  168. package/dist/esm/gridview/basePanelView.js +10 -8
  169. package/dist/esm/gridview/branchNode.js +2 -2
  170. package/dist/esm/gridview/gridview.js +17 -15
  171. package/dist/esm/gridview/gridviewComponent.d.ts +4 -0
  172. package/dist/esm/gridview/gridviewComponent.js +6 -2
  173. package/dist/esm/gridview/gridviewPanel.d.ts +0 -1
  174. package/dist/esm/gridview/gridviewPanel.js +3 -6
  175. package/dist/esm/gridview/leafNode.js +1 -0
  176. package/dist/esm/groupview/groupPanel.d.ts +1 -7
  177. package/dist/esm/groupview/groupview.d.ts +15 -8
  178. package/dist/esm/groupview/groupview.js +22 -56
  179. package/dist/esm/groupview/groupviewPanel.d.ts +5 -2
  180. package/dist/esm/groupview/panel/content.js +1 -0
  181. package/dist/esm/groupview/tab.d.ts +10 -13
  182. package/dist/esm/groupview/tab.js +17 -24
  183. package/dist/esm/groupview/titlebar/tabsContainer.js +4 -6
  184. package/dist/esm/index.d.ts +3 -3
  185. package/dist/esm/index.js +1 -2
  186. package/dist/esm/lifecycle.js +2 -1
  187. package/dist/esm/panel/types.d.ts +0 -2
  188. package/dist/esm/paneview/draggablePaneviewPanel.d.ts +2 -2
  189. package/dist/esm/paneview/draggablePaneviewPanel.js +32 -29
  190. package/dist/esm/paneview/paneview.js +2 -2
  191. package/dist/esm/paneview/paneviewComponent.d.ts +5 -5
  192. package/dist/esm/paneview/paneviewComponent.js +15 -8
  193. package/dist/esm/paneview/paneviewPanel.d.ts +5 -1
  194. package/dist/esm/paneview/paneviewPanel.js +10 -2
  195. package/dist/esm/react/deserializer.js +1 -3
  196. package/dist/esm/react/dockview/dockview.d.ts +9 -9
  197. package/dist/esm/react/dockview/dockview.js +24 -2
  198. package/dist/esm/react/dockview/reactContentPart.js +4 -4
  199. package/dist/esm/react/dockview/reactHeaderPart.js +1 -0
  200. package/dist/esm/react/dockview/reactWatermarkPart.d.ts +1 -2
  201. package/dist/esm/react/dockview/reactWatermarkPart.js +1 -2
  202. package/dist/esm/react/gridview/gridview.js +4 -1
  203. package/dist/esm/react/gridview/view.js +2 -2
  204. package/dist/esm/react/index.d.ts +1 -0
  205. package/dist/esm/react/react.js +1 -2
  206. package/dist/esm/react/splitview/splitview.js +3 -1
  207. package/dist/esm/react/splitview/view.js +2 -2
  208. package/dist/esm/splitview/core/splitview.js +2 -2
  209. package/dist/esm/splitview/splitviewComponent.d.ts +9 -6
  210. package/dist/esm/splitview/splitviewComponent.js +11 -2
  211. package/dist/esm/splitview/splitviewPanel.d.ts +1 -6
  212. package/dist/esm/splitview/splitviewPanel.js +5 -3
  213. package/dist/styles/dockview.css +51 -54
  214. package/package.json +11 -11
  215. package/dist/cjs/functions.d.ts +0 -1
  216. package/dist/cjs/functions.js +0 -42
  217. package/dist/cjs/functions.js.map +0 -1
  218. package/dist/cjs/groupview/panel/hostedPanel.d.ts +0 -22
  219. package/dist/cjs/groupview/panel/hostedPanel.js +0 -57
  220. package/dist/cjs/groupview/panel/hostedPanel.js.map +0 -1
  221. package/dist/cjs/json.d.ts +0 -1
  222. package/dist/cjs/json.js +0 -14
  223. package/dist/cjs/json.js.map +0 -1
  224. package/dist/esm/functions.d.ts +0 -1
  225. package/dist/esm/functions.js +0 -8
  226. package/dist/esm/groupview/panel/hostedPanel.d.ts +0 -22
  227. package/dist/esm/groupview/panel/hostedPanel.js +0 -43
  228. package/dist/esm/json.d.ts +0 -1
  229. package/dist/esm/json.js +0 -9
@@ -1,24 +1,14 @@
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';
13
4
  import { DockviewGroupPanel } from './dockviewGroupPanel';
14
5
  import { CompositeDisposable } from '../lifecycle';
15
- import { Emitter } from '../events';
6
+ import { Event, 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';
21
- import { BaseGrid, GroupChangeKind, toTarget, } from '../gridview/baseComponentGridview';
11
+ import { BaseGrid, toTarget, } from '../gridview/baseComponentGridview';
22
12
  import { DockviewApi } from '../api/component.api';
23
13
  import { MouseEventKind } from '../groupview/tab';
24
14
  import { Orientation } from '../splitview/core/splitview';
@@ -34,15 +24,24 @@ 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, Event.any(this.onDidAddPanel, this.onDidRemovePanel, this.onDidActivePanelChange)(() => {
43
+ this._bufferOnDidLayoutChange.fire();
44
+ }));
46
45
  this._options = options;
47
46
  if (!this.options.components) {
48
47
  this.options.components = {};
@@ -63,10 +62,10 @@ export class DockviewComponent extends BaseGrid {
63
62
  this._api = new DockviewApi(this);
64
63
  }
65
64
  get totalPanels() {
66
- return this._panels.size;
65
+ return this.panels.length;
67
66
  }
68
67
  get panels() {
69
- return Array.from(this._panels.values()).map((_) => _.value);
68
+ return this.groups.flatMap((group) => group.model.panels);
70
69
  }
71
70
  get deserializer() {
72
71
  return this._deserializer;
@@ -96,10 +95,6 @@ export class DockviewComponent extends BaseGrid {
96
95
  updateOptions(options) {
97
96
  const hasOrientationChanged = typeof options.orientation === 'string' &&
98
97
  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
98
  this._options = Object.assign(Object.assign({}, this.options), options);
104
99
  if (hasOrientationChanged) {
105
100
  this.gridview.orientation = options.orientation;
@@ -111,8 +106,7 @@ export class DockviewComponent extends BaseGrid {
111
106
  (_a = this.activeGroup) === null || _a === void 0 ? void 0 : _a.focus();
112
107
  }
113
108
  getGroupPanel(id) {
114
- var _a;
115
- return (_a = this._panels.get(id)) === null || _a === void 0 ? void 0 : _a.value;
109
+ return this.panels.find((panel) => panel.id === id);
116
110
  }
117
111
  setActivePanel(panel) {
118
112
  if (!panel.group) {
@@ -161,24 +155,6 @@ export class DockviewComponent extends BaseGrid {
161
155
  this.doSetGroupActive(next);
162
156
  }
163
157
  }
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
158
  /**
183
159
  * Serialize the current state of the layout
184
160
  *
@@ -186,12 +162,9 @@ export class DockviewComponent extends BaseGrid {
186
162
  */
187
163
  toJSON() {
188
164
  var _a;
189
- this.syncConfigs();
190
165
  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
- }
166
+ const panels = this.panels.reduce((collection, panel) => {
167
+ collection[panel.id] = panel.toJSON();
195
168
  return collection;
196
169
  }, {});
197
170
  return {
@@ -202,13 +175,12 @@ export class DockviewComponent extends BaseGrid {
202
175
  };
203
176
  }
204
177
  fromJSON(data) {
178
+ const groups = Array.from(this._groups.values()).map((_) => _.value);
179
+ for (const group of groups) {
180
+ // remove the group will automatically remove the panels
181
+ this.removeGroup(group, true);
182
+ }
205
183
  this.gridview.clear();
206
- this._panels.forEach((panel) => {
207
- panel.disposable.dispose();
208
- panel.value.dispose();
209
- });
210
- this._panels.clear();
211
- this._groups.clear();
212
184
  if (!this.deserializer) {
213
185
  throw new Error('invalid deserializer');
214
186
  }
@@ -222,9 +194,7 @@ export class DockviewComponent extends BaseGrid {
222
194
  this.gridview.deserialize(grid, new DefaultDeserializer(this, {
223
195
  createPanel: (id) => {
224
196
  const panelData = panels[id];
225
- const panel = this.deserializer.fromJSON(panelData);
226
- this.registerPanel(panel);
227
- return panel;
197
+ return this.deserializer.fromJSON(panelData);
228
198
  },
229
199
  }));
230
200
  if (typeof activeGroup === 'string') {
@@ -234,31 +204,23 @@ export class DockviewComponent extends BaseGrid {
234
204
  }
235
205
  }
236
206
  this.gridview.layout(this.width, this.height);
237
- this._onGridEvent.fire({ kind: GroupChangeKind.LAYOUT_FROM_JSON });
207
+ this._onDidLayoutfromJSON.fire();
238
208
  }
239
209
  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
- });
210
+ for (const entry of this._groups.entries()) {
211
+ const [_, group] = entry;
212
+ group.value.model.closeAllPanels();
213
+ }
250
214
  }
251
215
  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;
216
+ if (event.kind === MouseEventKind.CONTEXT_MENU) {
217
+ if (event.tab && event.panel) {
218
+ this._onTabContextMenu.fire({
219
+ event: event.event,
220
+ api: this._api,
221
+ panel: event.panel,
222
+ });
223
+ }
262
224
  }
263
225
  }
264
226
  addPanel(options) {
@@ -291,14 +253,13 @@ export class DockviewComponent extends BaseGrid {
291
253
  }
292
254
  return panel;
293
255
  }
294
- removePanel(panel) {
295
- this.unregisterPanel(panel);
256
+ removePanel(panel, options = { removeEmptyGroup: true }) {
296
257
  const group = panel.group;
297
258
  if (!group) {
298
259
  throw new Error(`cannot remove panel ${panel.id}. it's missing a group.`);
299
260
  }
300
261
  group.model.removePanel(panel);
301
- if (group.model.size === 0) {
262
+ if (group.model.size === 0 && options.removeEmptyGroup) {
302
263
  this.removeGroup(group);
303
264
  }
304
265
  }
@@ -311,10 +272,9 @@ export class DockviewComponent extends BaseGrid {
311
272
  : {}, (_a = this.options.frameworkComponentFactory) === null || _a === void 0 ? void 0 : _a.watermark);
312
273
  }
313
274
  addEmptyGroup(options) {
314
- var _a;
315
275
  const group = this.createGroup();
316
276
  if (options) {
317
- const referencePanel = (_a = this._panels.get(options.referencePanel)) === null || _a === void 0 ? void 0 : _a.value;
277
+ const referencePanel = this.panels.find((panel) => panel.id === options.referencePanel);
318
278
  if (!referencePanel) {
319
279
  throw new Error(`reference panel ${options.referencePanel} does not exist`);
320
280
  }
@@ -331,25 +291,23 @@ export class DockviewComponent extends BaseGrid {
331
291
  this.doAddGroup(group);
332
292
  }
333
293
  }
334
- removeGroup(group) {
294
+ removeGroup(group, skipActive = false) {
335
295
  const panels = [...group.model.panels]; // reassign since group panels will mutate
336
- panels.forEach((panel) => {
337
- this.removePanel(panel);
338
- });
339
- if (this._groups.size === 1) {
340
- this._activeGroup = group;
341
- return;
296
+ for (const panel of panels) {
297
+ this.removePanel(panel, {
298
+ removeEmptyGroup: false,
299
+ });
342
300
  }
343
- super.removeGroup(group);
301
+ super.doRemoveGroup(group, { skipActive });
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
  }
@@ -399,10 +357,7 @@ export class DockviewComponent extends BaseGrid {
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)) {
402
- this._onGridEvent.fire({
403
- kind: GroupChangeKind.PANEL_ACTIVE,
404
- panel: (_b = this._activeGroup) === null || _b === void 0 ? void 0 : _b.model.activePanel,
405
- });
360
+ this._onDidActivePanelChange.fire((_b = this._activeGroup) === null || _b === void 0 ? void 0 : _b.model.activePanel);
406
361
  }
407
362
  }
408
363
  createGroup(options) {
@@ -428,31 +383,22 @@ export class DockviewComponent extends BaseGrid {
428
383
  const disposable = new CompositeDisposable(view.model.onMove((event) => {
429
384
  const { groupId, itemId, target, index } = event;
430
385
  this.moveGroupOrPanel(view, groupId, itemId, target, index);
386
+ }), view.model.onDidDrop((event) => {
387
+ this._onDidDrop.fire(Object.assign(Object.assign({}, event), { api: this._api }));
431
388
  }), view.model.onDidGroupChange((event) => {
432
389
  switch (event.kind) {
433
390
  case GroupChangeKind2.ADD_PANEL:
434
- this._onGridEvent.fire({
435
- kind: GroupChangeKind.ADD_PANEL,
436
- panel: event.panel,
437
- });
438
- break;
439
- case GroupChangeKind2.GROUP_ACTIVE:
440
- this._onGridEvent.fire({
441
- kind: GroupChangeKind.GROUP_ACTIVE,
442
- panel: event.panel,
443
- });
391
+ if (event.panel) {
392
+ this._onDidAddPanel.fire(event.panel);
393
+ }
444
394
  break;
445
395
  case GroupChangeKind2.REMOVE_PANEL:
446
- this._onGridEvent.fire({
447
- kind: GroupChangeKind.REMOVE_PANEL,
448
- panel: event.panel,
449
- });
396
+ if (event.panel) {
397
+ this._onDidRemovePanel.fire(event.panel);
398
+ }
450
399
  break;
451
400
  case GroupChangeKind2.PANEL_ACTIVE:
452
- this._onGridEvent.fire({
453
- kind: GroupChangeKind.PANEL_ACTIVE,
454
- panel: event.panel,
455
- });
401
+ this._onDidActivePanelChange.fire(event.panel);
456
402
  break;
457
403
  }
458
404
  }));
@@ -466,46 +412,18 @@ export class DockviewComponent extends BaseGrid {
466
412
  }
467
413
  return view;
468
414
  }
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
415
  _addPanel(options) {
497
416
  const view = new DefaultGroupPanelView({
498
417
  content: this.createContentComponent(options.id, options.component),
499
418
  tab: this.createTabComponent(options.id, options.tabComponent),
500
419
  });
501
- const panel = new DockviewGroupPanel(options.id, this._api);
420
+ const panel = new DockviewGroupPanel(options.id, this, this._api);
502
421
  panel.init({
503
422
  view,
504
423
  title: options.title || options.id,
505
424
  suppressClosable: options === null || options === void 0 ? void 0 : options.suppressClosable,
506
425
  params: (options === null || options === void 0 ? void 0 : options.params) || {},
507
426
  });
508
- this.registerPanel(panel);
509
427
  return panel;
510
428
  }
511
429
  createContentComponent(id, componentName) {
@@ -525,9 +443,11 @@ export class DockviewComponent extends BaseGrid {
525
443
  var _a;
526
444
  return (_a = Array.from(this._groups.values()).find((group) => group.value.model.containsPanel(panel))) === null || _a === void 0 ? void 0 : _a.value;
527
445
  }
528
- addDirtyPanel(panel) {
529
- this.dirtyPanels.add(panel);
530
- panel.setDirty(true);
531
- this.debouncedDeque();
446
+ dispose() {
447
+ super.dispose();
448
+ this._onDidActivePanelChange.dispose();
449
+ this._onDidAddPanel.dispose();
450
+ this._onDidRemovePanel.dispose();
451
+ this._onDidLayoutfromJSON.dispose();
532
452
  }
533
453
  }
@@ -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,19 +12,17 @@ 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;
18
+ get params(): any;
19
19
  get title(): string;
20
20
  get suppressClosable(): boolean;
21
21
  get group(): GroupviewPanel | undefined;
22
22
  get view(): IGroupPanelView | undefined;
23
- constructor(id: string, containerApi: DockviewApi);
23
+ constructor(id: string, accessor: DockviewComponent, containerApi: DockviewApi);
24
24
  init(params: IGroupPanelInitParameters): void;
25
25
  focus(): void;
26
- setDirty(isDirty: boolean): void;
27
- close(): Promise<boolean>;
28
26
  toJSON(): GroupviewPanelState;
29
27
  setTitle(title: string): void;
30
28
  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,14 +9,17 @@ 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 } });
19
17
  }));
20
18
  }
19
+ get params() {
20
+ var _a;
21
+ return (_a = this._params) === null || _a === void 0 ? void 0 : _a.params;
22
+ }
21
23
  get title() {
22
24
  return this._title;
23
25
  }
@@ -36,32 +38,18 @@ export class DockviewGroupPanel extends CompositeDisposable {
36
38
  this._view = params.view;
37
39
  this.setTitle(params.title);
38
40
  this.setSuppressClosable(params.suppressClosable || false);
39
- if (params.state) {
40
- this.api.setState(params.state);
41
- }
42
41
  (_a = this.view) === null || _a === void 0 ? void 0 : _a.init(Object.assign(Object.assign({}, params), { api: this.api, containerApi: this.containerApi }));
43
42
  }
44
43
  focus() {
45
44
  this.api._onFocusEvent.fire();
46
45
  }
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
46
  toJSON() {
57
- const state = this.api.getState();
58
47
  return {
59
48
  id: this.id,
60
49
  view: this.view.toJSON(),
61
50
  params: Object.keys(this._params || {}).length > 0
62
51
  ? this._params
63
52
  : undefined,
64
- state: state && Object.keys(state).length > 0 ? state : undefined,
65
53
  suppressClosable: this.suppressClosable || undefined,
66
54
  title: this.title,
67
55
  };
@@ -106,18 +94,6 @@ export class DockviewGroupPanel extends CompositeDisposable {
106
94
  var _a;
107
95
  this._group = group;
108
96
  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
97
  const isPanelVisible = this._group.model.isPanelActive(this);
122
98
  this.api._onDidActiveChange.fire({
123
99
  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 = [];
@@ -1,29 +1,14 @@
1
- import { Emitter, Event } from '../events';
1
+ import { Event, TickDelayedEvent } from '../events';
2
2
  import { Gridview, IGridView } from './gridview';
3
3
  import { Position } from '../dnd/droptarget';
4
4
  import { CompositeDisposable, IValueDisposable } from '../lifecycle';
5
5
  import { ISplitviewStyles, Orientation } from '../splitview/core/splitview';
6
6
  import { IPanel } from '../panel/types';
7
7
  import { MovementOptions2 } from '../dockview/options';
8
- import { IGroupPanel } from '../groupview/groupPanel';
9
- export declare enum GroupChangeKind {
10
- ADD_PANEL = "ADD_PANEL",
11
- REMOVE_PANEL = "REMOVE_PANEL",
12
- PANEL_ACTIVE = "PANEL_ACTIVE",
13
- GROUP_ACTIVE = "GROUP_ACTIVE",
14
- ADD_GROUP = "ADD_GROUP",
15
- REMOVE_GROUP = "REMOVE_GROUP",
16
- LAYOUT_FROM_JSON = "LAYOUT_FROM_JSON",
17
- LAYOUT = "LAYOUT"
18
- }
19
- export interface GroupChangeEvent {
20
- readonly kind: GroupChangeKind;
21
- readonly panel?: IGroupPanel;
22
- }
23
8
  export declare type Direction = 'left' | 'right' | 'above' | 'below' | 'within';
24
9
  export declare function toTarget(direction: Direction): Position;
25
10
  export interface BaseGridOptions {
26
- readonly proportionalLayout?: boolean;
11
+ readonly proportionalLayout: boolean;
27
12
  readonly orientation: Orientation;
28
13
  readonly styles?: ISplitviewStyles;
29
14
  }
@@ -43,8 +28,10 @@ export interface IBaseGrid<T extends IGridPanelView> {
43
28
  readonly activeGroup: T | undefined;
44
29
  readonly size: number;
45
30
  readonly groups: T[];
46
- readonly onGridEvent: Event<GroupChangeEvent>;
47
31
  readonly onDidLayoutChange: Event<void>;
32
+ readonly onDidRemoveGroup: Event<T>;
33
+ readonly onDidAddGroup: Event<T>;
34
+ readonly onDidActiveGroupChange: Event<T | undefined>;
48
35
  getPanel(id: string): T | undefined;
49
36
  toJSON(): object;
50
37
  fromJSON(data: any): void;
@@ -59,10 +46,15 @@ export declare abstract class BaseGrid<T extends IGridPanelView> extends Composi
59
46
  protected readonly _groups: Map<string, IValueDisposable<T>>;
60
47
  protected readonly gridview: Gridview;
61
48
  protected _activeGroup: T | undefined;
62
- protected readonly _onGridEvent: Emitter<GroupChangeEvent>;
63
- readonly onGridEvent: Event<GroupChangeEvent>;
64
49
  private _onDidLayoutChange;
65
50
  readonly onDidLayoutChange: Event<void>;
51
+ private readonly _onDidRemoveGroup;
52
+ readonly onDidRemoveGroup: Event<T>;
53
+ private readonly _onDidAddGroup;
54
+ readonly onDidAddGroup: Event<T>;
55
+ private readonly _onDidActiveGroupChange;
56
+ readonly onDidActiveGroupChange: Event<T | undefined>;
57
+ protected readonly _bufferOnDidLayoutChange: TickDelayedEvent;
66
58
  get id(): string;
67
59
  get element(): HTMLElement;
68
60
  get size(): number;