dockview 1.0.3 → 1.3.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 (261) hide show
  1. package/README.md +243 -186
  2. package/dist/cjs/api/component.api.d.ts +31 -25
  3. package/dist/cjs/api/component.api.js +97 -40
  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 +15 -15
  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 +72 -48
  29. package/dist/cjs/dnd/droptarget.js.map +1 -1
  30. package/dist/cjs/dockview/components/tab/defaultTab.d.ts +1 -2
  31. package/dist/cjs/dockview/components/tab/defaultTab.js +1 -9
  32. package/dist/cjs/dockview/components/tab/defaultTab.js.map +1 -1
  33. package/dist/cjs/dockview/components/watermark/watermark.d.ts +3 -3
  34. package/dist/cjs/dockview/components/watermark/watermark.js +4 -4
  35. package/dist/cjs/dockview/components/watermark/watermark.js.map +1 -1
  36. package/dist/cjs/dockview/deserializer.js.map +1 -1
  37. package/dist/cjs/dockview/dockviewComponent.d.ts +34 -23
  38. package/dist/cjs/dockview/dockviewComponent.js +117 -209
  39. package/dist/cjs/dockview/dockviewComponent.js.map +1 -1
  40. package/dist/cjs/dockview/dockviewGroupPanel.d.ts +3 -5
  41. package/dist/cjs/dockview/dockviewGroupPanel.js +10 -31
  42. package/dist/cjs/dockview/dockviewGroupPanel.js.map +1 -1
  43. package/dist/cjs/dockview/options.d.ts +2 -1
  44. package/dist/cjs/events.js +25 -4
  45. package/dist/cjs/events.js.map +1 -1
  46. package/dist/cjs/gridview/baseComponentGridview.d.ts +12 -20
  47. package/dist/cjs/gridview/baseComponentGridview.js +49 -45
  48. package/dist/cjs/gridview/baseComponentGridview.js.map +1 -1
  49. package/dist/cjs/gridview/basePanelView.d.ts +5 -8
  50. package/dist/cjs/gridview/basePanelView.js +16 -8
  51. package/dist/cjs/gridview/basePanelView.js.map +1 -1
  52. package/dist/cjs/gridview/branchNode.js +3 -3
  53. package/dist/cjs/gridview/branchNode.js.map +1 -1
  54. package/dist/cjs/gridview/gridview.js +21 -18
  55. package/dist/cjs/gridview/gridview.js.map +1 -1
  56. package/dist/cjs/gridview/gridviewComponent.d.ts +5 -6
  57. package/dist/cjs/gridview/gridviewComponent.js +33 -9
  58. package/dist/cjs/gridview/gridviewComponent.js.map +1 -1
  59. package/dist/cjs/gridview/gridviewPanel.d.ts +0 -1
  60. package/dist/cjs/gridview/gridviewPanel.js +3 -6
  61. package/dist/cjs/gridview/gridviewPanel.js.map +1 -1
  62. package/dist/cjs/gridview/leafNode.js +2 -1
  63. package/dist/cjs/gridview/leafNode.js.map +1 -1
  64. package/dist/cjs/groupview/groupPanel.d.ts +1 -7
  65. package/dist/cjs/groupview/groupview.d.ts +18 -10
  66. package/dist/cjs/groupview/groupview.js +51 -129
  67. package/dist/cjs/groupview/groupview.js.map +1 -1
  68. package/dist/cjs/groupview/groupviewPanel.d.ts +5 -2
  69. package/dist/cjs/groupview/groupviewPanel.js.map +1 -1
  70. package/dist/cjs/groupview/panel/content.d.ts +1 -1
  71. package/dist/cjs/groupview/panel/content.js +2 -1
  72. package/dist/cjs/groupview/panel/content.js.map +1 -1
  73. package/dist/cjs/groupview/tab.d.ts +10 -13
  74. package/dist/cjs/groupview/tab.js +22 -80
  75. package/dist/cjs/groupview/tab.js.map +1 -1
  76. package/dist/cjs/groupview/titlebar/tabsContainer.js +4 -6
  77. package/dist/cjs/groupview/titlebar/tabsContainer.js.map +1 -1
  78. package/dist/cjs/hostedContainer.js +2 -2
  79. package/dist/cjs/hostedContainer.js.map +1 -1
  80. package/dist/cjs/index.d.ts +3 -3
  81. package/dist/cjs/index.js +8 -4
  82. package/dist/cjs/index.js.map +1 -1
  83. package/dist/cjs/lifecycle.js +2 -1
  84. package/dist/cjs/lifecycle.js.map +1 -1
  85. package/dist/cjs/panel/types.d.ts +0 -2
  86. package/dist/cjs/paneview/defaultPaneviewHeader.d.ts +1 -1
  87. package/dist/cjs/paneview/defaultPaneviewHeader.js +1 -1
  88. package/dist/cjs/paneview/defaultPaneviewHeader.js.map +1 -1
  89. package/dist/cjs/paneview/draggablePaneviewPanel.d.ts +2 -2
  90. package/dist/cjs/paneview/draggablePaneviewPanel.js +32 -29
  91. package/dist/cjs/paneview/draggablePaneviewPanel.js.map +1 -1
  92. package/dist/cjs/paneview/paneview.d.ts +3 -1
  93. package/dist/cjs/paneview/paneview.js +13 -7
  94. package/dist/cjs/paneview/paneview.js.map +1 -1
  95. package/dist/cjs/paneview/paneviewComponent.d.ts +7 -6
  96. package/dist/cjs/paneview/paneviewComponent.js +65 -8
  97. package/dist/cjs/paneview/paneviewComponent.js.map +1 -1
  98. package/dist/cjs/paneview/paneviewPanel.js +1 -1
  99. package/dist/cjs/paneview/paneviewPanel.js.map +1 -1
  100. package/dist/cjs/react/deserializer.js +1 -3
  101. package/dist/cjs/react/deserializer.js.map +1 -1
  102. package/dist/cjs/react/dockview/components.js +5 -1
  103. package/dist/cjs/react/dockview/components.js.map +1 -1
  104. package/dist/cjs/react/dockview/dockview.d.ts +9 -9
  105. package/dist/cjs/react/dockview/dockview.js +40 -5
  106. package/dist/cjs/react/dockview/dockview.js.map +1 -1
  107. package/dist/cjs/react/dockview/reactContentPart.d.ts +2 -2
  108. package/dist/cjs/react/dockview/reactContentPart.js +6 -17
  109. package/dist/cjs/react/dockview/reactContentPart.js.map +1 -1
  110. package/dist/cjs/react/dockview/reactHeaderPart.d.ts +2 -2
  111. package/dist/cjs/react/dockview/reactHeaderPart.js +3 -2
  112. package/dist/cjs/react/dockview/reactHeaderPart.js.map +1 -1
  113. package/dist/cjs/react/dockview/reactWatermarkPart.d.ts +3 -4
  114. package/dist/cjs/react/dockview/reactWatermarkPart.js +3 -4
  115. package/dist/cjs/react/dockview/reactWatermarkPart.js.map +1 -1
  116. package/dist/cjs/react/dockview/v2/reactContentRenderer.d.ts +2 -2
  117. package/dist/cjs/react/dockview/v2/reactContentRenderer.js +2 -2
  118. package/dist/cjs/react/dockview/v2/reactContentRenderer.js.map +1 -1
  119. package/dist/cjs/react/dockview/v2/webviewContentRenderer.d.ts +2 -2
  120. package/dist/cjs/react/dockview/v2/webviewContentRenderer.js +2 -2
  121. package/dist/cjs/react/dockview/v2/webviewContentRenderer.js.map +1 -1
  122. package/dist/cjs/react/gridview/gridview.js +9 -2
  123. package/dist/cjs/react/gridview/gridview.js.map +1 -1
  124. package/dist/cjs/react/gridview/view.d.ts +3 -2
  125. package/dist/cjs/react/gridview/view.js +2 -2
  126. package/dist/cjs/react/gridview/view.js.map +1 -1
  127. package/dist/cjs/react/index.d.ts +1 -0
  128. package/dist/cjs/react/index.js +5 -1
  129. package/dist/cjs/react/index.js.map +1 -1
  130. package/dist/cjs/react/paneview/paneview.js +6 -2
  131. package/dist/cjs/react/paneview/paneview.js.map +1 -1
  132. package/dist/cjs/react/react.js +6 -3
  133. package/dist/cjs/react/react.js.map +1 -1
  134. package/dist/cjs/react/splitview/splitview.js +8 -2
  135. package/dist/cjs/react/splitview/splitview.js.map +1 -1
  136. package/dist/cjs/react/splitview/view.js +2 -2
  137. package/dist/cjs/react/splitview/view.js.map +1 -1
  138. package/dist/cjs/splitview/core/splitview.js +1 -1
  139. package/dist/cjs/splitview/core/splitview.js.map +1 -1
  140. package/dist/cjs/splitview/splitviewComponent.d.ts +0 -3
  141. package/dist/cjs/splitview/splitviewComponent.js +50 -6
  142. package/dist/cjs/splitview/splitviewComponent.js.map +1 -1
  143. package/dist/cjs/splitview/splitviewPanel.d.ts +1 -6
  144. package/dist/cjs/splitview/splitviewPanel.js +5 -3
  145. package/dist/cjs/splitview/splitviewPanel.js.map +1 -1
  146. package/dist/dockview.amd.js +666 -791
  147. package/dist/dockview.amd.min.js +2 -16
  148. package/dist/dockview.amd.min.noStyle.js +2 -16
  149. package/dist/dockview.amd.noStyle.js +665 -790
  150. package/dist/dockview.cjs.js +666 -791
  151. package/dist/dockview.esm.js +666 -780
  152. package/dist/dockview.esm.min.js +2 -16
  153. package/dist/dockview.js +666 -791
  154. package/dist/dockview.min.js +2 -16
  155. package/dist/dockview.min.noStyle.js +2 -16
  156. package/dist/dockview.noStyle.js +665 -790
  157. package/dist/esm/api/component.api.d.ts +31 -25
  158. package/dist/esm/api/component.api.js +47 -26
  159. package/dist/esm/api/gridviewPanelApi.js +1 -0
  160. package/dist/esm/api/groupPanelApi.d.ts +11 -14
  161. package/dist/esm/api/groupPanelApi.js +18 -13
  162. package/dist/esm/api/panelApi.d.ts +0 -25
  163. package/dist/esm/api/panelApi.js +1 -20
  164. package/dist/esm/api/paneviewPanelApi.js +1 -0
  165. package/dist/esm/api/splitviewPanelApi.d.ts +0 -1
  166. package/dist/esm/api/splitviewPanelApi.js +1 -5
  167. package/dist/esm/dnd/abstractDragHandler.d.ts +2 -2
  168. package/dist/esm/dnd/abstractDragHandler.js +10 -10
  169. package/dist/esm/dnd/dataTransfer.d.ts +0 -25
  170. package/dist/esm/dnd/dataTransfer.js +0 -40
  171. package/dist/esm/dnd/dnd.d.ts +1 -14
  172. package/dist/esm/dnd/dnd.js +1 -69
  173. package/dist/esm/dnd/droptarget.d.ts +3 -0
  174. package/dist/esm/dnd/droptarget.js +72 -48
  175. package/dist/esm/dockview/components/tab/defaultTab.d.ts +1 -2
  176. package/dist/esm/dockview/components/tab/defaultTab.js +2 -10
  177. package/dist/esm/dockview/components/watermark/watermark.d.ts +3 -3
  178. package/dist/esm/dockview/components/watermark/watermark.js +4 -4
  179. package/dist/esm/dockview/dockviewComponent.d.ts +34 -23
  180. package/dist/esm/dockview/dockviewComponent.js +82 -150
  181. package/dist/esm/dockview/dockviewGroupPanel.d.ts +3 -5
  182. package/dist/esm/dockview/dockviewGroupPanel.js +6 -30
  183. package/dist/esm/dockview/options.d.ts +2 -1
  184. package/dist/esm/events.js +2 -3
  185. package/dist/esm/gridview/baseComponentGridview.d.ts +12 -20
  186. package/dist/esm/gridview/baseComponentGridview.js +27 -45
  187. package/dist/esm/gridview/basePanelView.d.ts +5 -8
  188. package/dist/esm/gridview/basePanelView.js +12 -8
  189. package/dist/esm/gridview/branchNode.js +3 -3
  190. package/dist/esm/gridview/gridview.js +18 -16
  191. package/dist/esm/gridview/gridviewComponent.d.ts +5 -6
  192. package/dist/esm/gridview/gridviewComponent.js +12 -10
  193. package/dist/esm/gridview/gridviewPanel.d.ts +0 -1
  194. package/dist/esm/gridview/gridviewPanel.js +3 -6
  195. package/dist/esm/gridview/leafNode.js +1 -0
  196. package/dist/esm/groupview/groupPanel.d.ts +1 -7
  197. package/dist/esm/groupview/groupview.d.ts +18 -10
  198. package/dist/esm/groupview/groupview.js +30 -59
  199. package/dist/esm/groupview/groupviewPanel.d.ts +5 -2
  200. package/dist/esm/groupview/panel/content.d.ts +1 -1
  201. package/dist/esm/groupview/panel/content.js +2 -1
  202. package/dist/esm/groupview/tab.d.ts +10 -13
  203. package/dist/esm/groupview/tab.js +17 -24
  204. package/dist/esm/groupview/titlebar/tabsContainer.js +4 -6
  205. package/dist/esm/hostedContainer.js +2 -2
  206. package/dist/esm/index.d.ts +3 -3
  207. package/dist/esm/index.js +1 -2
  208. package/dist/esm/lifecycle.js +2 -1
  209. package/dist/esm/panel/types.d.ts +0 -2
  210. package/dist/esm/paneview/defaultPaneviewHeader.d.ts +1 -1
  211. package/dist/esm/paneview/defaultPaneviewHeader.js +1 -1
  212. package/dist/esm/paneview/draggablePaneviewPanel.d.ts +2 -2
  213. package/dist/esm/paneview/draggablePaneviewPanel.js +32 -29
  214. package/dist/esm/paneview/paneview.d.ts +3 -1
  215. package/dist/esm/paneview/paneview.js +10 -6
  216. package/dist/esm/paneview/paneviewComponent.d.ts +7 -6
  217. package/dist/esm/paneview/paneviewComponent.js +31 -7
  218. package/dist/esm/paneview/paneviewPanel.js +1 -1
  219. package/dist/esm/react/deserializer.js +1 -3
  220. package/dist/esm/react/dockview/dockview.d.ts +9 -9
  221. package/dist/esm/react/dockview/dockview.js +36 -5
  222. package/dist/esm/react/dockview/reactContentPart.d.ts +2 -2
  223. package/dist/esm/react/dockview/reactContentPart.js +6 -17
  224. package/dist/esm/react/dockview/reactHeaderPart.d.ts +2 -2
  225. package/dist/esm/react/dockview/reactHeaderPart.js +3 -2
  226. package/dist/esm/react/dockview/reactWatermarkPart.d.ts +3 -4
  227. package/dist/esm/react/dockview/reactWatermarkPart.js +3 -4
  228. package/dist/esm/react/dockview/v2/reactContentRenderer.d.ts +2 -2
  229. package/dist/esm/react/dockview/v2/reactContentRenderer.js +2 -2
  230. package/dist/esm/react/dockview/v2/webviewContentRenderer.d.ts +2 -2
  231. package/dist/esm/react/dockview/v2/webviewContentRenderer.js +2 -2
  232. package/dist/esm/react/gridview/gridview.js +4 -1
  233. package/dist/esm/react/gridview/view.d.ts +3 -2
  234. package/dist/esm/react/gridview/view.js +2 -2
  235. package/dist/esm/react/index.d.ts +1 -0
  236. package/dist/esm/react/paneview/paneview.js +1 -1
  237. package/dist/esm/react/react.js +1 -2
  238. package/dist/esm/react/splitview/splitview.js +3 -1
  239. package/dist/esm/react/splitview/view.js +2 -2
  240. package/dist/esm/splitview/core/splitview.js +1 -1
  241. package/dist/esm/splitview/splitviewComponent.d.ts +0 -3
  242. package/dist/esm/splitview/splitviewComponent.js +17 -6
  243. package/dist/esm/splitview/splitviewPanel.d.ts +1 -6
  244. package/dist/esm/splitview/splitviewPanel.js +5 -3
  245. package/dist/styles/dockview.css +14 -17
  246. package/package.json +13 -13
  247. package/dist/cjs/functions.d.ts +0 -1
  248. package/dist/cjs/functions.js +0 -42
  249. package/dist/cjs/functions.js.map +0 -1
  250. package/dist/cjs/groupview/panel/hostedPanel.d.ts +0 -22
  251. package/dist/cjs/groupview/panel/hostedPanel.js +0 -57
  252. package/dist/cjs/groupview/panel/hostedPanel.js.map +0 -1
  253. package/dist/cjs/json.d.ts +0 -1
  254. package/dist/cjs/json.js +0 -14
  255. package/dist/cjs/json.js.map +0 -1
  256. package/dist/esm/functions.d.ts +0 -1
  257. package/dist/esm/functions.js +0 -8
  258. package/dist/esm/groupview/panel/hostedPanel.d.ts +0 -22
  259. package/dist/esm/groupview/panel/hostedPanel.js +0 -43
  260. package/dist/esm/json.d.ts +0 -1
  261. 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,36 +204,31 @@ 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) {
265
227
  var _a, _b;
266
- const panel = this._addPanel(options);
228
+ if (this.panels.find((_) => _.id === options.id)) {
229
+ throw new Error(`panel with id ${options.id} already exists`);
230
+ }
231
+ const panel = this.createPanel(options);
267
232
  let referenceGroup;
268
233
  if ((_a = options.position) === null || _a === void 0 ? void 0 : _a.referencePanel) {
269
234
  const referencePanel = this.getGroupPanel(options.position.referencePanel);
@@ -291,14 +256,20 @@ export class DockviewComponent extends BaseGrid {
291
256
  }
292
257
  return panel;
293
258
  }
294
- removePanel(panel) {
295
- this.unregisterPanel(panel);
259
+ removePanel(panel, options = {
260
+ removeEmptyGroup: true,
261
+ skipDispose: false,
262
+ }) {
296
263
  const group = panel.group;
297
264
  if (!group) {
298
265
  throw new Error(`cannot remove panel ${panel.id}. it's missing a group.`);
299
266
  }
300
267
  group.model.removePanel(panel);
301
- if (group.model.size === 0) {
268
+ panel.dispose();
269
+ const retainGroupForWatermark = this.size === 1;
270
+ if (!retainGroupForWatermark &&
271
+ group.model.size === 0 &&
272
+ options.removeEmptyGroup) {
302
273
  this.removeGroup(group);
303
274
  }
304
275
  }
@@ -311,10 +282,9 @@ export class DockviewComponent extends BaseGrid {
311
282
  : {}, (_a = this.options.frameworkComponentFactory) === null || _a === void 0 ? void 0 : _a.watermark);
312
283
  }
313
284
  addEmptyGroup(options) {
314
- var _a;
315
285
  const group = this.createGroup();
316
286
  if (options) {
317
- const referencePanel = (_a = this._panels.get(options.referencePanel)) === null || _a === void 0 ? void 0 : _a.value;
287
+ const referencePanel = this.panels.find((panel) => panel.id === options.referencePanel);
318
288
  if (!referencePanel) {
319
289
  throw new Error(`reference panel ${options.referencePanel} does not exist`);
320
290
  }
@@ -331,25 +301,24 @@ export class DockviewComponent extends BaseGrid {
331
301
  this.doAddGroup(group);
332
302
  }
333
303
  }
334
- removeGroup(group) {
304
+ removeGroup(group, skipActive = false) {
335
305
  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;
306
+ for (const panel of panels) {
307
+ this.removePanel(panel, {
308
+ removeEmptyGroup: false,
309
+ skipDispose: false,
310
+ });
342
311
  }
343
- super.removeGroup(group);
312
+ super.doRemoveGroup(group, { skipActive });
344
313
  }
345
314
  moveGroupOrPanel(referenceGroup, groupId, itemId, target, index) {
346
- var _a, _b, _c;
315
+ var _a;
347
316
  const sourceGroup = groupId
348
317
  ? (_a = this._groups.get(groupId)) === null || _a === void 0 ? void 0 : _a.value
349
318
  : undefined;
350
319
  if (!target || target === Position.Center) {
351
320
  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);
321
+ this.panels.find((panel) => panel.id === itemId);
353
322
  if (!groupItem) {
354
323
  throw new Error(`No panel with id ${itemId}`);
355
324
  }
@@ -385,7 +354,7 @@ export class DockviewComponent extends BaseGrid {
385
354
  }
386
355
  else {
387
356
  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);
357
+ this.panels.find((panel) => panel.id === itemId);
389
358
  if (!groupItem) {
390
359
  throw new Error(`No panel with id ${itemId}`);
391
360
  }
@@ -399,10 +368,7 @@ export class DockviewComponent extends BaseGrid {
399
368
  const isGroupAlreadyFocused = this._activeGroup === group;
400
369
  super.doSetGroupActive(group, skipFocus);
401
370
  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
- });
371
+ this._onDidActivePanelChange.fire((_b = this._activeGroup) === null || _b === void 0 ? void 0 : _b.model.activePanel);
406
372
  }
407
373
  }
408
374
  createGroup(options) {
@@ -424,35 +390,27 @@ export class DockviewComponent extends BaseGrid {
424
390
  }
425
391
  }
426
392
  const view = new GroupviewPanel(this, id, options);
393
+ view.init({ params: {}, containerApi: null }); // required to initialized .part and allow for correct disposal of group
427
394
  if (!this._groups.has(view.id)) {
428
395
  const disposable = new CompositeDisposable(view.model.onMove((event) => {
429
396
  const { groupId, itemId, target, index } = event;
430
397
  this.moveGroupOrPanel(view, groupId, itemId, target, index);
398
+ }), view.model.onDidDrop((event) => {
399
+ this._onDidDrop.fire(Object.assign(Object.assign({}, event), { api: this._api }));
431
400
  }), view.model.onDidGroupChange((event) => {
432
401
  switch (event.kind) {
433
402
  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
- });
403
+ if (event.panel) {
404
+ this._onDidAddPanel.fire(event.panel);
405
+ }
444
406
  break;
445
407
  case GroupChangeKind2.REMOVE_PANEL:
446
- this._onGridEvent.fire({
447
- kind: GroupChangeKind.REMOVE_PANEL,
448
- panel: event.panel,
449
- });
408
+ if (event.panel) {
409
+ this._onDidRemovePanel.fire(event.panel);
410
+ }
450
411
  break;
451
412
  case GroupChangeKind2.PANEL_ACTIVE:
452
- this._onGridEvent.fire({
453
- kind: GroupChangeKind.PANEL_ACTIVE,
454
- panel: event.panel,
455
- });
413
+ this._onDidActivePanelChange.fire(event.panel);
456
414
  break;
457
415
  }
458
416
  }));
@@ -466,46 +424,18 @@ export class DockviewComponent extends BaseGrid {
466
424
  }
467
425
  return view;
468
426
  }
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
- _addPanel(options) {
427
+ createPanel(options) {
497
428
  const view = new DefaultGroupPanelView({
498
429
  content: this.createContentComponent(options.id, options.component),
499
430
  tab: this.createTabComponent(options.id, options.tabComponent),
500
431
  });
501
- const panel = new DockviewGroupPanel(options.id, this._api);
432
+ const panel = new DockviewGroupPanel(options.id, this, this._api);
502
433
  panel.init({
503
434
  view,
504
435
  title: options.title || options.id,
505
436
  suppressClosable: options === null || options === void 0 ? void 0 : options.suppressClosable,
506
437
  params: (options === null || options === void 0 ? void 0 : options.params) || {},
507
438
  });
508
- this.registerPanel(panel);
509
439
  return panel;
510
440
  }
511
441
  createContentComponent(id, componentName) {
@@ -525,9 +455,11 @@ export class DockviewComponent extends BaseGrid {
525
455
  var _a;
526
456
  return (_a = Array.from(this._groups.values()).find((group) => group.value.model.containsPanel(panel))) === null || _a === void 0 ? void 0 : _a.value;
527
457
  }
528
- addDirtyPanel(panel) {
529
- this.dirtyPanels.add(panel);
530
- panel.setDirty(true);
531
- this.debouncedDeque();
458
+ dispose() {
459
+ super.dispose();
460
+ this._onDidActivePanelChange.dispose();
461
+ this._onDidAddPanel.dispose();
462
+ this._onDidRemovePanel.dispose();
463
+ this._onDidLayoutfromJSON.dispose();
532
464
  }
533
465
  }
@@ -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;