dockview 1.5.0 → 1.5.2

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 (339) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +52 -52
  3. package/dist/cjs/actionbar/actionsContainer.d.ts +7 -7
  4. package/dist/cjs/actionbar/actionsContainer.js +26 -26
  5. package/dist/cjs/api/component.api.d.ts +144 -144
  6. package/dist/cjs/api/component.api.js +571 -571
  7. package/dist/cjs/api/gridviewPanelApi.d.ts +36 -36
  8. package/dist/cjs/api/gridviewPanelApi.js +47 -47
  9. package/dist/cjs/api/groupPanelApi.d.ts +34 -41
  10. package/dist/cjs/api/groupPanelApi.js +85 -96
  11. package/dist/cjs/api/groupPanelApi.js.map +1 -1
  12. package/dist/cjs/api/panelApi.d.ts +81 -81
  13. package/dist/cjs/api/panelApi.js +121 -121
  14. package/dist/cjs/api/paneviewPanelApi.d.ts +26 -26
  15. package/dist/cjs/api/paneviewPanelApi.js +57 -57
  16. package/dist/cjs/api/splitviewPanelApi.d.ts +32 -32
  17. package/dist/cjs/api/splitviewPanelApi.js +47 -47
  18. package/dist/cjs/array.d.ts +13 -13
  19. package/dist/cjs/array.js +77 -77
  20. package/dist/cjs/dnd/abstractDragHandler.d.ts +11 -11
  21. package/dist/cjs/dnd/abstractDragHandler.js +115 -115
  22. package/dist/cjs/dnd/dataTransfer.d.ts +31 -31
  23. package/dist/cjs/dnd/dataTransfer.js +100 -100
  24. package/dist/cjs/dnd/dnd.d.ts +27 -27
  25. package/dist/cjs/dnd/dnd.js +64 -64
  26. package/dist/cjs/dnd/droptarget.d.ts +37 -37
  27. package/dist/cjs/dnd/droptarget.js +201 -201
  28. package/dist/cjs/dockview/components/tab/defaultTab.d.ts +27 -27
  29. package/dist/cjs/dockview/components/tab/defaultTab.js +121 -126
  30. package/dist/cjs/dockview/components/tab/defaultTab.js.map +1 -1
  31. package/dist/cjs/dockview/components/watermark/watermark.d.ts +20 -20
  32. package/dist/cjs/dockview/components/watermark/watermark.js +101 -101
  33. package/dist/cjs/dockview/defaultGroupPanelView.d.ts +29 -29
  34. package/dist/cjs/dockview/defaultGroupPanelView.js +68 -68
  35. package/dist/cjs/dockview/deserializer.d.ts +5 -5
  36. package/dist/cjs/dockview/deserializer.js +2 -2
  37. package/dist/cjs/dockview/dockviewComponent.d.ts +125 -130
  38. package/dist/cjs/dockview/dockviewComponent.js +614 -629
  39. package/dist/cjs/dockview/dockviewComponent.js.map +1 -1
  40. package/dist/cjs/dockview/dockviewGroupPanel.d.ts +31 -33
  41. package/dist/cjs/dockview/dockviewGroupPanel.js +156 -175
  42. package/dist/cjs/dockview/dockviewGroupPanel.js.map +1 -1
  43. package/dist/cjs/dockview/options.d.ts +88 -89
  44. package/dist/cjs/dockview/options.js +2 -2
  45. package/dist/cjs/dom.d.ts +14 -14
  46. package/dist/cjs/dom.js +182 -182
  47. package/dist/cjs/events.d.ts +30 -30
  48. package/dist/cjs/events.js +129 -129
  49. package/dist/cjs/gridview/baseComponentGridview.d.ts +87 -87
  50. package/dist/cjs/gridview/baseComponentGridview.js +279 -279
  51. package/dist/cjs/gridview/basePanelView.d.ts +43 -43
  52. package/dist/cjs/gridview/basePanelView.js +123 -123
  53. package/dist/cjs/gridview/branchNode.d.ts +49 -46
  54. package/dist/cjs/gridview/branchNode.js +342 -342
  55. package/dist/cjs/gridview/branchNode.js.map +1 -1
  56. package/dist/cjs/gridview/gridview.d.ts +126 -123
  57. package/dist/cjs/gridview/gridview.js +479 -479
  58. package/dist/cjs/gridview/gridview.js.map +1 -1
  59. package/dist/cjs/gridview/gridviewComponent.d.ts +85 -85
  60. package/dist/cjs/gridview/gridviewComponent.js +325 -325
  61. package/dist/cjs/gridview/gridviewPanel.d.ts +60 -60
  62. package/dist/cjs/gridview/gridviewPanel.js +202 -202
  63. package/dist/cjs/gridview/leafNode.d.ts +34 -31
  64. package/dist/cjs/gridview/leafNode.js +170 -165
  65. package/dist/cjs/gridview/leafNode.js.map +1 -1
  66. package/dist/cjs/gridview/options.d.ts +18 -18
  67. package/dist/cjs/gridview/options.js +2 -2
  68. package/dist/cjs/gridview/types.d.ts +3 -3
  69. package/dist/cjs/gridview/types.js +2 -2
  70. package/dist/cjs/groupview/dnd.d.ts +5 -5
  71. package/dist/cjs/groupview/dnd.js +9 -9
  72. package/dist/cjs/groupview/groupPanel.d.ts +32 -35
  73. package/dist/cjs/groupview/groupPanel.js +2 -2
  74. package/dist/cjs/groupview/groupview.d.ts +177 -177
  75. package/dist/cjs/groupview/groupview.js +589 -589
  76. package/dist/cjs/groupview/groupviewPanel.d.ts +35 -35
  77. package/dist/cjs/groupview/groupviewPanel.js +128 -128
  78. package/dist/cjs/groupview/panel/content.d.ts +30 -30
  79. package/dist/cjs/groupview/panel/content.js +100 -100
  80. package/dist/cjs/groupview/tab.d.ts +41 -42
  81. package/dist/cjs/groupview/tab.js +120 -126
  82. package/dist/cjs/groupview/tab.js.map +1 -1
  83. package/dist/cjs/groupview/titlebar/tabsContainer.d.ts +68 -68
  84. package/dist/cjs/groupview/titlebar/tabsContainer.js +258 -270
  85. package/dist/cjs/groupview/titlebar/tabsContainer.js.map +1 -1
  86. package/dist/cjs/groupview/types.d.ts +52 -53
  87. package/dist/cjs/groupview/types.js +2 -2
  88. package/dist/cjs/hostedContainer.d.ts +23 -23
  89. package/dist/cjs/hostedContainer.js +73 -73
  90. package/dist/cjs/index.d.ts +30 -30
  91. package/dist/cjs/index.js +46 -46
  92. package/dist/cjs/index.js.map +1 -1
  93. package/dist/cjs/lifecycle.d.ts +22 -22
  94. package/dist/cjs/lifecycle.js +88 -88
  95. package/dist/cjs/math.d.ts +4 -4
  96. package/dist/cjs/math.js +15 -15
  97. package/dist/cjs/panel/componentFactory.d.ts +8 -8
  98. package/dist/cjs/panel/componentFactory.js +30 -30
  99. package/dist/cjs/panel/types.d.ts +33 -33
  100. package/dist/cjs/panel/types.js +2 -2
  101. package/dist/cjs/paneview/defaultPaneviewHeader.d.ts +21 -21
  102. package/dist/cjs/paneview/defaultPaneviewHeader.js +90 -90
  103. package/dist/cjs/paneview/draggablePaneviewPanel.d.ts +19 -19
  104. package/dist/cjs/paneview/draggablePaneviewPanel.js +129 -129
  105. package/dist/cjs/paneview/options.d.ts +27 -27
  106. package/dist/cjs/paneview/options.js +2 -2
  107. package/dist/cjs/paneview/paneview.d.ts +40 -40
  108. package/dist/cjs/paneview/paneview.js +201 -201
  109. package/dist/cjs/paneview/paneviewComponent.d.ts +129 -129
  110. package/dist/cjs/paneview/paneviewComponent.js +394 -394
  111. package/dist/cjs/paneview/paneviewPanel.d.ts +92 -89
  112. package/dist/cjs/paneview/paneviewPanel.js +274 -274
  113. package/dist/cjs/paneview/paneviewPanel.js.map +1 -1
  114. package/dist/cjs/react/deserializer.d.ts +9 -9
  115. package/dist/cjs/react/deserializer.js +43 -45
  116. package/dist/cjs/react/deserializer.js.map +1 -1
  117. package/dist/cjs/react/dockview/defaultTab.d.ts +4 -4
  118. package/dist/cjs/react/dockview/defaultTab.js +72 -72
  119. package/dist/cjs/react/dockview/defaultTab.js.map +1 -1
  120. package/dist/cjs/react/dockview/dockview.d.ts +34 -35
  121. package/dist/cjs/react/dockview/dockview.js +212 -227
  122. package/dist/cjs/react/dockview/dockview.js.map +1 -1
  123. package/dist/cjs/react/dockview/groupControlsRenderer.d.ts +43 -43
  124. package/dist/cjs/react/dockview/groupControlsRenderer.js +86 -86
  125. package/dist/cjs/react/dockview/reactContentPart.d.ts +30 -30
  126. package/dist/cjs/react/dockview/reactContentPart.js +58 -58
  127. package/dist/cjs/react/dockview/reactHeaderPart.d.ts +26 -26
  128. package/dist/cjs/react/dockview/reactHeaderPart.js +55 -55
  129. package/dist/cjs/react/dockview/reactWatermarkPart.d.ts +29 -29
  130. package/dist/cjs/react/dockview/reactWatermarkPart.js +65 -65
  131. package/dist/cjs/react/dockview/v2/reactContentRenderer.d.ts +29 -29
  132. package/dist/cjs/react/dockview/v2/reactContentRenderer.js +87 -87
  133. package/dist/cjs/react/dockview/v2/reactGroupPanelView.d.ts +7 -7
  134. package/dist/cjs/react/dockview/v2/reactGroupPanelView.js +34 -34
  135. package/dist/cjs/react/dockview/v2/webviewContentRenderer.d.ts +18 -18
  136. package/dist/cjs/react/dockview/v2/webviewContentRenderer.js +45 -45
  137. package/dist/cjs/react/gridview/gridview.d.ts +24 -24
  138. package/dist/cjs/react/gridview/gridview.js +112 -112
  139. package/dist/cjs/react/gridview/view.d.ts +11 -11
  140. package/dist/cjs/react/gridview/view.js +40 -40
  141. package/dist/cjs/react/index.d.ts +9 -9
  142. package/dist/cjs/react/index.js +23 -23
  143. package/dist/cjs/react/paneview/paneview.d.ts +30 -30
  144. package/dist/cjs/react/paneview/paneview.js +155 -155
  145. package/dist/cjs/react/paneview/view.d.ts +20 -20
  146. package/dist/cjs/react/paneview/view.js +44 -44
  147. package/dist/cjs/react/react.d.ts +36 -36
  148. package/dist/cjs/react/react.js +194 -194
  149. package/dist/cjs/react/splitview/splitview.d.ts +24 -24
  150. package/dist/cjs/react/splitview/splitview.js +108 -108
  151. package/dist/cjs/react/splitview/view.d.ts +10 -10
  152. package/dist/cjs/react/splitview/view.js +40 -40
  153. package/dist/cjs/react/svg.d.ts +3 -3
  154. package/dist/cjs/react/svg.js +35 -35
  155. package/dist/cjs/react/types.d.ts +7 -7
  156. package/dist/cjs/react/types.js +2 -2
  157. package/dist/cjs/splitview/core/options.d.ts +26 -26
  158. package/dist/cjs/splitview/core/options.js +2 -2
  159. package/dist/cjs/splitview/core/splitview.d.ts +127 -124
  160. package/dist/cjs/splitview/core/splitview.js +908 -908
  161. package/dist/cjs/splitview/core/splitview.js.map +1 -1
  162. package/dist/cjs/splitview/core/viewItem.d.ts +25 -25
  163. package/dist/cjs/splitview/core/viewItem.js +124 -124
  164. package/dist/cjs/splitview/splitviewComponent.d.ts +101 -101
  165. package/dist/cjs/splitview/splitviewComponent.js +373 -373
  166. package/dist/cjs/splitview/splitviewPanel.d.ts +45 -42
  167. package/dist/cjs/splitview/splitviewPanel.js +178 -178
  168. package/dist/cjs/splitview/splitviewPanel.js.map +1 -1
  169. package/dist/cjs/svg.d.ts +3 -3
  170. package/dist/cjs/svg.js +43 -43
  171. package/dist/cjs/types.d.ts +7 -7
  172. package/dist/cjs/types.js +2 -2
  173. package/dist/dockview.amd.js +6737 -6797
  174. package/dist/dockview.amd.min.js +2 -2
  175. package/dist/dockview.amd.min.noStyle.js +2 -2
  176. package/dist/dockview.amd.noStyle.js +6743 -6803
  177. package/dist/dockview.cjs.js +6737 -6797
  178. package/dist/dockview.esm.js +6731 -6791
  179. package/dist/dockview.esm.min.js +2 -2
  180. package/dist/dockview.js +6737 -6797
  181. package/dist/dockview.min.js +2 -2
  182. package/dist/dockview.min.noStyle.js +2 -2
  183. package/dist/dockview.noStyle.js +6743 -6803
  184. package/dist/esm/actionbar/actionsContainer.d.ts +7 -7
  185. package/dist/esm/actionbar/actionsContainer.js +17 -17
  186. package/dist/esm/api/component.api.d.ts +144 -144
  187. package/dist/esm/api/component.api.js +326 -326
  188. package/dist/esm/api/gridviewPanelApi.d.ts +36 -36
  189. package/dist/esm/api/gridviewPanelApi.js +25 -25
  190. package/dist/esm/api/groupPanelApi.d.ts +34 -41
  191. package/dist/esm/api/groupPanelApi.js +50 -57
  192. package/dist/esm/api/panelApi.d.ts +81 -81
  193. package/dist/esm/api/panelApi.js +79 -79
  194. package/dist/esm/api/paneviewPanelApi.d.ts +26 -26
  195. package/dist/esm/api/paneviewPanelApi.js +27 -27
  196. package/dist/esm/api/splitviewPanelApi.d.ts +32 -32
  197. package/dist/esm/api/splitviewPanelApi.js +25 -25
  198. package/dist/esm/array.d.ts +13 -13
  199. package/dist/esm/array.js +67 -67
  200. package/dist/esm/dnd/abstractDragHandler.d.ts +11 -11
  201. package/dist/esm/dnd/abstractDragHandler.js +37 -37
  202. package/dist/esm/dnd/dataTransfer.d.ts +31 -31
  203. package/dist/esm/dnd/dataTransfer.js +69 -69
  204. package/dist/esm/dnd/dnd.d.ts +27 -27
  205. package/dist/esm/dnd/dnd.js +41 -41
  206. package/dist/esm/dnd/droptarget.d.ts +37 -37
  207. package/dist/esm/dnd/droptarget.js +167 -167
  208. package/dist/esm/dockview/components/tab/defaultTab.d.ts +27 -27
  209. package/dist/esm/dockview/components/tab/defaultTab.js +79 -84
  210. package/dist/esm/dockview/components/watermark/watermark.d.ts +20 -20
  211. package/dist/esm/dockview/components/watermark/watermark.js +70 -70
  212. package/dist/esm/dockview/defaultGroupPanelView.d.ts +29 -29
  213. package/dist/esm/dockview/defaultGroupPanelView.js +44 -44
  214. package/dist/esm/dockview/deserializer.d.ts +5 -5
  215. package/dist/esm/dockview/deserializer.js +1 -1
  216. package/dist/esm/dockview/dockviewComponent.d.ts +125 -130
  217. package/dist/esm/dockview/dockviewComponent.js +468 -483
  218. package/dist/esm/dockview/dockviewGroupPanel.d.ts +31 -33
  219. package/dist/esm/dockview/dockviewGroupPanel.js +107 -122
  220. package/dist/esm/dockview/options.d.ts +88 -89
  221. package/dist/esm/dockview/options.js +1 -1
  222. package/dist/esm/dom.d.ts +14 -14
  223. package/dist/esm/dom.js +113 -113
  224. package/dist/esm/events.d.ts +30 -30
  225. package/dist/esm/events.js +88 -88
  226. package/dist/esm/gridview/baseComponentGridview.d.ts +87 -87
  227. package/dist/esm/gridview/baseComponentGridview.js +189 -189
  228. package/dist/esm/gridview/basePanelView.d.ts +43 -43
  229. package/dist/esm/gridview/basePanelView.js +74 -74
  230. package/dist/esm/gridview/branchNode.d.ts +49 -46
  231. package/dist/esm/gridview/branchNode.js +218 -218
  232. package/dist/esm/gridview/gridview.d.ts +126 -123
  233. package/dist/esm/gridview/gridview.js +397 -397
  234. package/dist/esm/gridview/gridviewComponent.d.ts +85 -85
  235. package/dist/esm/gridview/gridviewComponent.js +238 -238
  236. package/dist/esm/gridview/gridviewPanel.d.ts +60 -60
  237. package/dist/esm/gridview/gridviewPanel.js +138 -138
  238. package/dist/esm/gridview/leafNode.d.ts +34 -31
  239. package/dist/esm/gridview/leafNode.js +103 -98
  240. package/dist/esm/gridview/options.d.ts +18 -18
  241. package/dist/esm/gridview/options.js +1 -1
  242. package/dist/esm/gridview/types.d.ts +3 -3
  243. package/dist/esm/gridview/types.js +1 -1
  244. package/dist/esm/groupview/dnd.d.ts +5 -5
  245. package/dist/esm/groupview/dnd.js +6 -6
  246. package/dist/esm/groupview/groupPanel.d.ts +32 -35
  247. package/dist/esm/groupview/groupPanel.js +1 -1
  248. package/dist/esm/groupview/groupview.d.ts +177 -177
  249. package/dist/esm/groupview/groupview.js +444 -444
  250. package/dist/esm/groupview/groupviewPanel.d.ts +35 -35
  251. package/dist/esm/groupview/groupviewPanel.js +61 -61
  252. package/dist/esm/groupview/panel/content.d.ts +30 -30
  253. package/dist/esm/groupview/panel/content.js +73 -73
  254. package/dist/esm/groupview/tab.d.ts +41 -42
  255. package/dist/esm/groupview/tab.js +90 -96
  256. package/dist/esm/groupview/titlebar/tabsContainer.d.ts +68 -68
  257. package/dist/esm/groupview/titlebar/tabsContainer.js +190 -191
  258. package/dist/esm/groupview/types.d.ts +52 -53
  259. package/dist/esm/groupview/types.js +1 -1
  260. package/dist/esm/hostedContainer.d.ts +23 -23
  261. package/dist/esm/hostedContainer.js +63 -63
  262. package/dist/esm/index.d.ts +30 -30
  263. package/dist/esm/index.js +23 -23
  264. package/dist/esm/lifecycle.d.ts +22 -22
  265. package/dist/esm/lifecycle.js +39 -39
  266. package/dist/esm/math.d.ts +4 -4
  267. package/dist/esm/math.js +10 -10
  268. package/dist/esm/panel/componentFactory.d.ts +8 -8
  269. package/dist/esm/panel/componentFactory.js +24 -24
  270. package/dist/esm/panel/types.d.ts +33 -33
  271. package/dist/esm/panel/types.js +1 -1
  272. package/dist/esm/paneview/defaultPaneviewHeader.d.ts +21 -21
  273. package/dist/esm/paneview/defaultPaneviewHeader.js +63 -63
  274. package/dist/esm/paneview/draggablePaneviewPanel.d.ts +19 -19
  275. package/dist/esm/paneview/draggablePaneviewPanel.js +90 -90
  276. package/dist/esm/paneview/options.d.ts +27 -27
  277. package/dist/esm/paneview/options.js +1 -1
  278. package/dist/esm/paneview/paneview.d.ts +40 -40
  279. package/dist/esm/paneview/paneview.js +145 -145
  280. package/dist/esm/paneview/paneviewComponent.d.ts +129 -129
  281. package/dist/esm/paneview/paneviewComponent.js +270 -270
  282. package/dist/esm/paneview/paneviewPanel.d.ts +92 -89
  283. package/dist/esm/paneview/paneviewPanel.js +191 -191
  284. package/dist/esm/react/deserializer.d.ts +9 -9
  285. package/dist/esm/react/deserializer.js +38 -40
  286. package/dist/esm/react/dockview/defaultTab.d.ts +4 -4
  287. package/dist/esm/react/dockview/defaultTab.js +34 -34
  288. package/dist/esm/react/dockview/dockview.d.ts +34 -35
  289. package/dist/esm/react/dockview/dockview.js +157 -172
  290. package/dist/esm/react/dockview/groupControlsRenderer.d.ts +43 -43
  291. package/dist/esm/react/dockview/groupControlsRenderer.js +68 -68
  292. package/dist/esm/react/dockview/reactContentPart.d.ts +30 -30
  293. package/dist/esm/react/dockview/reactContentPart.js +49 -49
  294. package/dist/esm/react/dockview/reactHeaderPart.d.ts +26 -26
  295. package/dist/esm/react/dockview/reactHeaderPart.js +46 -46
  296. package/dist/esm/react/dockview/reactWatermarkPart.d.ts +29 -29
  297. package/dist/esm/react/dockview/reactWatermarkPart.js +55 -55
  298. package/dist/esm/react/dockview/v2/reactContentRenderer.d.ts +29 -29
  299. package/dist/esm/react/dockview/v2/reactContentRenderer.js +69 -69
  300. package/dist/esm/react/dockview/v2/reactGroupPanelView.d.ts +7 -7
  301. package/dist/esm/react/dockview/v2/reactGroupPanelView.js +12 -12
  302. package/dist/esm/react/dockview/v2/webviewContentRenderer.d.ts +18 -18
  303. package/dist/esm/react/dockview/v2/webviewContentRenderer.js +36 -36
  304. package/dist/esm/react/gridview/gridview.d.ts +24 -24
  305. package/dist/esm/react/gridview/gridview.js +70 -70
  306. package/dist/esm/react/gridview/view.d.ts +11 -11
  307. package/dist/esm/react/gridview/view.js +18 -18
  308. package/dist/esm/react/index.d.ts +9 -9
  309. package/dist/esm/react/index.js +7 -7
  310. package/dist/esm/react/paneview/paneview.d.ts +30 -30
  311. package/dist/esm/react/paneview/paneview.js +100 -100
  312. package/dist/esm/react/paneview/view.d.ts +20 -20
  313. package/dist/esm/react/paneview/view.js +35 -35
  314. package/dist/esm/react/react.d.ts +36 -36
  315. package/dist/esm/react/react.js +125 -125
  316. package/dist/esm/react/splitview/splitview.d.ts +24 -24
  317. package/dist/esm/react/splitview/splitview.js +66 -66
  318. package/dist/esm/react/splitview/view.d.ts +10 -10
  319. package/dist/esm/react/splitview/view.js +18 -18
  320. package/dist/esm/react/svg.d.ts +3 -3
  321. package/dist/esm/react/svg.js +7 -7
  322. package/dist/esm/react/types.d.ts +7 -7
  323. package/dist/esm/react/types.js +1 -1
  324. package/dist/esm/splitview/core/options.d.ts +26 -26
  325. package/dist/esm/splitview/core/options.js +1 -1
  326. package/dist/esm/splitview/core/splitview.d.ts +127 -124
  327. package/dist/esm/splitview/core/splitview.js +689 -689
  328. package/dist/esm/splitview/core/viewItem.d.ts +25 -25
  329. package/dist/esm/splitview/core/viewItem.js +79 -79
  330. package/dist/esm/splitview/splitviewComponent.d.ts +101 -101
  331. package/dist/esm/splitview/splitviewComponent.js +249 -249
  332. package/dist/esm/splitview/splitviewPanel.d.ts +45 -42
  333. package/dist/esm/splitview/splitviewPanel.js +107 -107
  334. package/dist/esm/svg.d.ts +3 -3
  335. package/dist/esm/svg.js +31 -31
  336. package/dist/esm/types.d.ts +7 -7
  337. package/dist/esm/types.js +1 -1
  338. package/dist/styles/dockview.css +0 -3
  339. package/package.json +2 -2
@@ -1,689 +1,689 @@
1
- /*---------------------------------------------------------------------------------------------
2
- * Accreditation: This file is largly based upon the MIT licenced VSCode sourcecode found at:
3
- * https://github.com/microsoft/vscode/tree/main/src/vs/base/browser/ui/splitview
4
- *--------------------------------------------------------------------------------------------*/
5
- import { removeClasses, addClasses, toggleClass, getElementsByTagName, } from '../../dom';
6
- import { clamp } from '../../math';
7
- import { Emitter } from '../../events';
8
- import { pushToStart, pushToEnd, range, firstIndex } from '../../array';
9
- import { ViewItem } from './viewItem';
10
- export var Orientation;
11
- (function (Orientation) {
12
- Orientation["HORIZONTAL"] = "HORIZONTAL";
13
- Orientation["VERTICAL"] = "VERTICAL";
14
- })(Orientation || (Orientation = {}));
15
- export var SashState;
16
- (function (SashState) {
17
- SashState[SashState["MAXIMUM"] = 0] = "MAXIMUM";
18
- SashState[SashState["MINIMUM"] = 1] = "MINIMUM";
19
- SashState[SashState["DISABLED"] = 2] = "DISABLED";
20
- SashState[SashState["ENABLED"] = 3] = "ENABLED";
21
- })(SashState || (SashState = {}));
22
- export var LayoutPriority;
23
- (function (LayoutPriority) {
24
- LayoutPriority["Low"] = "low";
25
- LayoutPriority["High"] = "high";
26
- LayoutPriority["Normal"] = "normal";
27
- })(LayoutPriority || (LayoutPriority = {}));
28
- export var Sizing;
29
- (function (Sizing) {
30
- Sizing.Distribute = { type: 'distribute' };
31
- function Split(index) {
32
- return { type: 'split', index };
33
- }
34
- Sizing.Split = Split;
35
- function Invisible(cachedVisibleSize) {
36
- return { type: 'invisible', cachedVisibleSize };
37
- }
38
- Sizing.Invisible = Invisible;
39
- })(Sizing || (Sizing = {}));
40
- export class Splitview {
41
- constructor(container, options) {
42
- this.container = container;
43
- this.views = [];
44
- this.sashes = [];
45
- this._size = 0;
46
- this._orthogonalSize = 0;
47
- this.contentSize = 0;
48
- this._proportions = undefined;
49
- this._onDidSashEnd = new Emitter();
50
- this.onDidSashEnd = this._onDidSashEnd.event;
51
- this._onDidAddView = new Emitter();
52
- this.onDidAddView = this._onDidAddView.event;
53
- this._onDidRemoveView = new Emitter();
54
- this.onDidRemoveView = this._onDidRemoveView.event;
55
- this._startSnappingEnabled = true;
56
- this._endSnappingEnabled = true;
57
- this.resize = (index, delta, sizes = this.views.map((x) => x.size), lowPriorityIndexes, highPriorityIndexes, overloadMinDelta = Number.NEGATIVE_INFINITY, overloadMaxDelta = Number.POSITIVE_INFINITY, snapBefore, snapAfter) => {
58
- if (index < 0 || index > this.views.length) {
59
- return 0;
60
- }
61
- const upIndexes = range(index, -1);
62
- const downIndexes = range(index + 1, this.views.length);
63
- //
64
- if (highPriorityIndexes) {
65
- for (const i of highPriorityIndexes) {
66
- pushToStart(upIndexes, i);
67
- pushToStart(downIndexes, i);
68
- }
69
- }
70
- if (lowPriorityIndexes) {
71
- for (const i of lowPriorityIndexes) {
72
- pushToEnd(upIndexes, i);
73
- pushToEnd(downIndexes, i);
74
- }
75
- }
76
- //
77
- const upItems = upIndexes.map((i) => this.views[i]);
78
- const upSizes = upIndexes.map((i) => sizes[i]);
79
- //
80
- const downItems = downIndexes.map((i) => this.views[i]);
81
- const downSizes = downIndexes.map((i) => sizes[i]);
82
- //
83
- const minDeltaUp = upIndexes.reduce((_, i) => _ + this.views[i].minimumSize - sizes[i], 0);
84
- const maxDeltaUp = upIndexes.reduce((_, i) => _ + this.views[i].maximumSize - sizes[i], 0);
85
- //
86
- const maxDeltaDown = downIndexes.length === 0
87
- ? Number.POSITIVE_INFINITY
88
- : downIndexes.reduce((_, i) => _ + sizes[i] - this.views[i].minimumSize, 0);
89
- const minDeltaDown = downIndexes.length === 0
90
- ? Number.NEGATIVE_INFINITY
91
- : downIndexes.reduce((_, i) => _ + sizes[i] - this.views[i].maximumSize, 0);
92
- //
93
- const minDelta = Math.max(minDeltaUp, minDeltaDown);
94
- const maxDelta = Math.min(maxDeltaDown, maxDeltaUp);
95
- //
96
- let snapped = false;
97
- if (snapBefore) {
98
- const snapView = this.views[snapBefore.index];
99
- const visible = delta >= snapBefore.limitDelta;
100
- snapped = visible !== snapView.visible;
101
- snapView.setVisible(visible, snapBefore.size);
102
- }
103
- if (!snapped && snapAfter) {
104
- const snapView = this.views[snapAfter.index];
105
- const visible = delta < snapAfter.limitDelta;
106
- snapped = visible !== snapView.visible;
107
- snapView.setVisible(visible, snapAfter.size);
108
- }
109
- if (snapped) {
110
- return this.resize(index, delta, sizes, lowPriorityIndexes, highPriorityIndexes, overloadMinDelta, overloadMaxDelta);
111
- }
112
- //
113
- const tentativeDelta = clamp(delta, minDelta, maxDelta);
114
- let actualDelta = 0;
115
- //
116
- let deltaUp = tentativeDelta;
117
- for (let i = 0; i < upItems.length; i++) {
118
- const item = upItems[i];
119
- const size = clamp(upSizes[i] + deltaUp, item.minimumSize, item.maximumSize);
120
- const viewDelta = size - upSizes[i];
121
- actualDelta += viewDelta;
122
- deltaUp -= viewDelta;
123
- item.size = size;
124
- }
125
- //
126
- let deltaDown = actualDelta;
127
- for (let i = 0; i < downItems.length; i++) {
128
- const item = downItems[i];
129
- const size = clamp(downSizes[i] - deltaDown, item.minimumSize, item.maximumSize);
130
- const viewDelta = size - downSizes[i];
131
- deltaDown += viewDelta;
132
- item.size = size;
133
- }
134
- //
135
- return delta;
136
- };
137
- this._orientation = options.orientation;
138
- this.element = this.createContainer();
139
- this.proportionalLayout =
140
- options.proportionalLayout === undefined
141
- ? true
142
- : !!options.proportionalLayout;
143
- this.viewContainer = this.createViewContainer();
144
- this.sashContainer = this.createSashContainer();
145
- this.element.appendChild(this.sashContainer);
146
- this.element.appendChild(this.viewContainer);
147
- this.container.appendChild(this.element);
148
- this.style(options.styles);
149
- // We have an existing set of view, add them now
150
- if (options.descriptor) {
151
- this._size = options.descriptor.size;
152
- options.descriptor.views.forEach((viewDescriptor, index) => {
153
- const sizing = viewDescriptor.visible === undefined ||
154
- viewDescriptor.visible
155
- ? viewDescriptor.size
156
- : {
157
- type: 'invisible',
158
- cachedVisibleSize: viewDescriptor.size,
159
- };
160
- const view = viewDescriptor.view;
161
- this.addView(view, sizing, index, true
162
- // true skip layout
163
- );
164
- });
165
- // Initialize content size and proportions for first layout
166
- this.contentSize = this.views.reduce((r, i) => r + i.size, 0);
167
- this.saveProportions();
168
- }
169
- }
170
- get size() {
171
- return this._size;
172
- }
173
- set size(value) {
174
- this._size = value;
175
- }
176
- get orthogonalSize() {
177
- return this._orthogonalSize;
178
- }
179
- set orthogonalSize(value) {
180
- this._orthogonalSize = value;
181
- }
182
- get length() {
183
- return this.views.length;
184
- }
185
- get proportions() {
186
- return this._proportions ? [...this._proportions] : undefined;
187
- }
188
- get orientation() {
189
- return this._orientation;
190
- }
191
- set orientation(value) {
192
- this._orientation = value;
193
- const tmp = this.size;
194
- this.size = this.orthogonalSize;
195
- this.orthogonalSize = tmp;
196
- removeClasses(this.element, 'horizontal', 'vertical');
197
- this.element.classList.add(this.orientation == Orientation.HORIZONTAL
198
- ? 'horizontal'
199
- : 'vertical');
200
- }
201
- get minimumSize() {
202
- return this.views.reduce((r, item) => r + item.minimumSize, 0);
203
- }
204
- get maximumSize() {
205
- return this.length === 0
206
- ? Number.POSITIVE_INFINITY
207
- : this.views.reduce((r, item) => r + item.maximumSize, 0);
208
- }
209
- get startSnappingEnabled() {
210
- return this._startSnappingEnabled;
211
- }
212
- set startSnappingEnabled(startSnappingEnabled) {
213
- if (this._startSnappingEnabled === startSnappingEnabled) {
214
- return;
215
- }
216
- this._startSnappingEnabled = startSnappingEnabled;
217
- this.updateSashEnablement();
218
- }
219
- get endSnappingEnabled() {
220
- return this._endSnappingEnabled;
221
- }
222
- set endSnappingEnabled(endSnappingEnabled) {
223
- if (this._endSnappingEnabled === endSnappingEnabled) {
224
- return;
225
- }
226
- this._endSnappingEnabled = endSnappingEnabled;
227
- this.updateSashEnablement();
228
- }
229
- style(styles) {
230
- if ((styles === null || styles === void 0 ? void 0 : styles.separatorBorder) === 'transparent') {
231
- removeClasses(this.element, 'separator-border');
232
- this.element.style.removeProperty('--dv-separator-border');
233
- }
234
- else {
235
- addClasses(this.element, 'separator-border');
236
- if (styles === null || styles === void 0 ? void 0 : styles.separatorBorder) {
237
- this.element.style.setProperty('--dv-separator-border', styles.separatorBorder);
238
- }
239
- }
240
- }
241
- isViewVisible(index) {
242
- if (index < 0 || index >= this.views.length) {
243
- throw new Error('Index out of bounds');
244
- }
245
- const viewItem = this.views[index];
246
- return viewItem.visible;
247
- }
248
- setViewVisible(index, visible) {
249
- if (index < 0 || index >= this.views.length) {
250
- throw new Error('Index out of bounds');
251
- }
252
- toggleClass(this.container, 'visible', visible);
253
- const viewItem = this.views[index];
254
- toggleClass(this.container, 'visible', visible);
255
- viewItem.setVisible(visible, viewItem.size);
256
- this.distributeEmptySpace(index);
257
- this.layoutViews();
258
- this.saveProportions();
259
- }
260
- getViewSize(index) {
261
- if (index < 0 || index >= this.views.length) {
262
- return -1;
263
- }
264
- return this.views[index].size;
265
- }
266
- resizeView(index, size) {
267
- if (index < 0 || index >= this.views.length) {
268
- return;
269
- }
270
- const indexes = range(this.views.length).filter((i) => i !== index);
271
- const lowPriorityIndexes = [
272
- ...indexes.filter((i) => this.views[i].priority === LayoutPriority.Low),
273
- index,
274
- ];
275
- const highPriorityIndexes = indexes.filter((i) => this.views[i].priority === LayoutPriority.High);
276
- const item = this.views[index];
277
- size = Math.round(size);
278
- size = clamp(size, item.minimumSize, Math.min(item.maximumSize, this._size));
279
- item.size = size;
280
- this.relayout(lowPriorityIndexes, highPriorityIndexes);
281
- }
282
- getViews() {
283
- return this.views.map((x) => x.view);
284
- }
285
- onDidChange(item, size) {
286
- const index = this.views.indexOf(item);
287
- if (index < 0 || index >= this.views.length) {
288
- return;
289
- }
290
- size = typeof size === 'number' ? size : item.size;
291
- size = clamp(size, item.minimumSize, item.maximumSize);
292
- item.size = size;
293
- this.relayout([index]);
294
- }
295
- addView(view, size = { type: 'distribute' }, index = this.views.length, skipLayout) {
296
- const container = document.createElement('div');
297
- container.className = 'view';
298
- container.appendChild(view.element);
299
- let viewSize;
300
- if (typeof size === 'number') {
301
- viewSize = size;
302
- }
303
- else if (size.type === 'split') {
304
- viewSize = this.getViewSize(size.index) / 2;
305
- }
306
- else if (size.type === 'invisible') {
307
- viewSize = { cachedVisibleSize: size.cachedVisibleSize };
308
- }
309
- else {
310
- viewSize = view.minimumSize;
311
- }
312
- const disposable = view.onDidChange((newSize) => this.onDidChange(viewItem, newSize));
313
- const dispose = () => {
314
- disposable === null || disposable === void 0 ? void 0 : disposable.dispose();
315
- this.viewContainer.removeChild(container);
316
- };
317
- const viewItem = new ViewItem(container, view, viewSize, { dispose });
318
- if (index === this.views.length) {
319
- this.viewContainer.appendChild(container);
320
- }
321
- else {
322
- this.viewContainer.insertBefore(container, this.viewContainer.children.item(index));
323
- }
324
- this.views.splice(index, 0, viewItem);
325
- if (this.views.length > 1) {
326
- //add sash
327
- const sash = document.createElement('div');
328
- sash.className = 'sash';
329
- const onStart = (event) => {
330
- for (const item of this.views) {
331
- item.enabled = false;
332
- }
333
- const iframes = [
334
- ...getElementsByTagName('iframe'),
335
- ...getElementsByTagName('webview'),
336
- ];
337
- for (const iframe of iframes) {
338
- iframe.style.pointerEvents = 'none';
339
- }
340
- const start = this._orientation === Orientation.HORIZONTAL
341
- ? event.clientX
342
- : event.clientY;
343
- const sashIndex = firstIndex(this.sashes, (s) => s.container === sash);
344
- //
345
- const sizes = this.views.map((x) => x.size);
346
- //
347
- let snapBefore;
348
- let snapAfter;
349
- const upIndexes = range(sashIndex, -1);
350
- const downIndexes = range(sashIndex + 1, this.views.length);
351
- const minDeltaUp = upIndexes.reduce((r, i) => r + (this.views[i].minimumSize - sizes[i]), 0);
352
- const maxDeltaUp = upIndexes.reduce((r, i) => r + (this.views[i].viewMaximumSize - sizes[i]), 0);
353
- const maxDeltaDown = downIndexes.length === 0
354
- ? Number.POSITIVE_INFINITY
355
- : downIndexes.reduce((r, i) => r + (sizes[i] - this.views[i].minimumSize), 0);
356
- const minDeltaDown = downIndexes.length === 0
357
- ? Number.NEGATIVE_INFINITY
358
- : downIndexes.reduce((r, i) => r +
359
- (sizes[i] - this.views[i].viewMaximumSize), 0);
360
- const minDelta = Math.max(minDeltaUp, minDeltaDown);
361
- const maxDelta = Math.min(maxDeltaDown, maxDeltaUp);
362
- const snapBeforeIndex = this.findFirstSnapIndex(upIndexes);
363
- const snapAfterIndex = this.findFirstSnapIndex(downIndexes);
364
- if (typeof snapBeforeIndex === 'number') {
365
- const snappedViewItem = this.views[snapBeforeIndex];
366
- const halfSize = Math.floor(snappedViewItem.viewMinimumSize / 2);
367
- snapBefore = {
368
- index: snapBeforeIndex,
369
- limitDelta: snappedViewItem.visible
370
- ? minDelta - halfSize
371
- : minDelta + halfSize,
372
- size: snappedViewItem.size,
373
- };
374
- }
375
- if (typeof snapAfterIndex === 'number') {
376
- const snappedViewItem = this.views[snapAfterIndex];
377
- const halfSize = Math.floor(snappedViewItem.viewMinimumSize / 2);
378
- snapAfter = {
379
- index: snapAfterIndex,
380
- limitDelta: snappedViewItem.visible
381
- ? maxDelta + halfSize
382
- : maxDelta - halfSize,
383
- size: snappedViewItem.size,
384
- };
385
- }
386
- //
387
- const mousemove = (mousemoveEvent) => {
388
- const current = this._orientation === Orientation.HORIZONTAL
389
- ? mousemoveEvent.clientX
390
- : mousemoveEvent.clientY;
391
- const delta = current - start;
392
- this.resize(sashIndex, delta, sizes, undefined, undefined, minDelta, maxDelta, snapBefore, snapAfter);
393
- this.distributeEmptySpace();
394
- this.layoutViews();
395
- };
396
- const end = () => {
397
- for (const item of this.views) {
398
- item.enabled = true;
399
- }
400
- for (const iframe of iframes) {
401
- iframe.style.pointerEvents = 'auto';
402
- }
403
- this.saveProportions();
404
- document.removeEventListener('mousemove', mousemove);
405
- document.removeEventListener('mouseup', end);
406
- document.removeEventListener('mouseend', end);
407
- this._onDidSashEnd.fire(undefined);
408
- };
409
- document.addEventListener('mousemove', mousemove);
410
- document.addEventListener('mouseup', end);
411
- document.addEventListener('mouseend', end);
412
- };
413
- sash.addEventListener('mousedown', onStart);
414
- const sashItem = {
415
- container: sash,
416
- disposable: () => {
417
- sash.removeEventListener('mousedown', onStart);
418
- this.sashContainer.removeChild(sash);
419
- },
420
- };
421
- this.sashContainer.appendChild(sash);
422
- this.sashes.push(sashItem);
423
- }
424
- if (!skipLayout) {
425
- this.relayout([index]);
426
- }
427
- if (!skipLayout &&
428
- typeof size !== 'number' &&
429
- size.type === 'distribute') {
430
- this.distributeViewSizes();
431
- }
432
- this._onDidAddView.fire(view);
433
- }
434
- distributeViewSizes() {
435
- const flexibleViewItems = [];
436
- let flexibleSize = 0;
437
- for (const item of this.views) {
438
- if (item.maximumSize - item.minimumSize > 0) {
439
- flexibleViewItems.push(item);
440
- flexibleSize += item.size;
441
- }
442
- }
443
- const size = Math.floor(flexibleSize / flexibleViewItems.length);
444
- for (const item of flexibleViewItems) {
445
- item.size = clamp(size, item.minimumSize, item.maximumSize);
446
- }
447
- const indexes = range(this.views.length);
448
- const lowPriorityIndexes = indexes.filter((i) => this.views[i].priority === LayoutPriority.Low);
449
- const highPriorityIndexes = indexes.filter((i) => this.views[i].priority === LayoutPriority.High);
450
- this.relayout(lowPriorityIndexes, highPriorityIndexes);
451
- }
452
- removeView(index, sizing, skipLayout = false) {
453
- // Remove view
454
- const viewItem = this.views.splice(index, 1)[0];
455
- viewItem.dispose();
456
- // Remove sash
457
- if (this.views.length >= 1) {
458
- const sashIndex = Math.max(index - 1, 0);
459
- const sashItem = this.sashes.splice(sashIndex, 1)[0];
460
- sashItem.disposable();
461
- }
462
- if (!skipLayout) {
463
- this.relayout();
464
- }
465
- if (sizing && sizing.type === 'distribute') {
466
- this.distributeViewSizes();
467
- }
468
- this._onDidRemoveView.fire(viewItem.view);
469
- return viewItem.view;
470
- }
471
- getViewCachedVisibleSize(index) {
472
- if (index < 0 || index >= this.views.length) {
473
- throw new Error('Index out of bounds');
474
- }
475
- const viewItem = this.views[index];
476
- return viewItem.cachedVisibleSize;
477
- }
478
- moveView(from, to) {
479
- const cachedVisibleSize = this.getViewCachedVisibleSize(from);
480
- const sizing = typeof cachedVisibleSize === 'undefined'
481
- ? this.getViewSize(from)
482
- : Sizing.Invisible(cachedVisibleSize);
483
- const view = this.removeView(from, undefined, true);
484
- this.addView(view, sizing, to);
485
- }
486
- layout(size, orthogonalSize) {
487
- const previousSize = Math.max(this.size, this.contentSize);
488
- this.size = size;
489
- this.orthogonalSize = orthogonalSize;
490
- if (!this.proportions) {
491
- const indexes = range(this.views.length);
492
- const lowPriorityIndexes = indexes.filter((i) => this.views[i].priority === LayoutPriority.Low);
493
- const highPriorityIndexes = indexes.filter((i) => this.views[i].priority === LayoutPriority.High);
494
- this.resize(this.views.length - 1, size - previousSize, undefined, lowPriorityIndexes, highPriorityIndexes);
495
- }
496
- else {
497
- for (let i = 0; i < this.views.length; i++) {
498
- const item = this.views[i];
499
- item.size = clamp(Math.round(this.proportions[i] * size), item.minimumSize, item.maximumSize);
500
- }
501
- }
502
- this.distributeEmptySpace();
503
- this.layoutViews();
504
- }
505
- relayout(lowPriorityIndexes, highPriorityIndexes) {
506
- const contentSize = this.views.reduce((r, i) => r + i.size, 0);
507
- this.resize(this.views.length - 1, this._size - contentSize, undefined, lowPriorityIndexes, highPriorityIndexes);
508
- this.distributeEmptySpace();
509
- this.layoutViews();
510
- this.saveProportions();
511
- }
512
- distributeEmptySpace(lowPriorityIndex) {
513
- const contentSize = this.views.reduce((r, i) => r + i.size, 0);
514
- let emptyDelta = this.size - contentSize;
515
- const indexes = range(this.views.length - 1, -1);
516
- const lowPriorityIndexes = indexes.filter((i) => this.views[i].priority === LayoutPriority.Low);
517
- const highPriorityIndexes = indexes.filter((i) => this.views[i].priority === LayoutPriority.High);
518
- for (const index of highPriorityIndexes) {
519
- pushToStart(indexes, index);
520
- }
521
- for (const index of lowPriorityIndexes) {
522
- pushToEnd(indexes, index);
523
- }
524
- if (typeof lowPriorityIndex === 'number') {
525
- pushToEnd(indexes, lowPriorityIndex);
526
- }
527
- for (let i = 0; emptyDelta !== 0 && i < indexes.length; i++) {
528
- const item = this.views[indexes[i]];
529
- const size = clamp(item.size + emptyDelta, item.minimumSize, item.maximumSize);
530
- const viewDelta = size - item.size;
531
- emptyDelta -= viewDelta;
532
- item.size = size;
533
- }
534
- }
535
- saveProportions() {
536
- if (this.proportionalLayout && this.contentSize > 0) {
537
- this._proportions = this.views.map((i) => i.size / this.contentSize);
538
- }
539
- }
540
- layoutViews() {
541
- this.contentSize = this.views.reduce((r, i) => r + i.size, 0);
542
- let sum = 0;
543
- const x = [];
544
- this.updateSashEnablement();
545
- for (let i = 0; i < this.views.length - 1; i++) {
546
- sum += this.views[i].size;
547
- x.push(sum);
548
- const offset = Math.min(Math.max(0, sum - 2), this.size - 4);
549
- if (this._orientation === Orientation.HORIZONTAL) {
550
- this.sashes[i].container.style.left = `${offset}px`;
551
- this.sashes[i].container.style.top = `0px`;
552
- }
553
- if (this._orientation === Orientation.VERTICAL) {
554
- this.sashes[i].container.style.left = `0px`;
555
- this.sashes[i].container.style.top = `${offset}px`;
556
- }
557
- }
558
- this.views.forEach((view, i) => {
559
- if (this._orientation === Orientation.HORIZONTAL) {
560
- view.container.style.width = `${view.size}px`;
561
- view.container.style.left = i == 0 ? '0px' : `${x[i - 1]}px`;
562
- view.container.style.top = '';
563
- view.container.style.height = '';
564
- }
565
- if (this._orientation === Orientation.VERTICAL) {
566
- view.container.style.height = `${view.size}px`;
567
- view.container.style.top = i == 0 ? '0px' : `${x[i - 1]}px`;
568
- view.container.style.width = '';
569
- view.container.style.left = '';
570
- }
571
- view.view.layout(view.size, this._orthogonalSize);
572
- });
573
- }
574
- findFirstSnapIndex(indexes) {
575
- // visible views first
576
- for (const index of indexes) {
577
- const viewItem = this.views[index];
578
- if (!viewItem.visible) {
579
- continue;
580
- }
581
- if (viewItem.snap) {
582
- return index;
583
- }
584
- }
585
- // then, hidden views
586
- for (const index of indexes) {
587
- const viewItem = this.views[index];
588
- if (viewItem.visible &&
589
- viewItem.maximumSize - viewItem.minimumSize > 0) {
590
- return undefined;
591
- }
592
- if (!viewItem.visible && viewItem.snap) {
593
- return index;
594
- }
595
- }
596
- return undefined;
597
- }
598
- updateSashEnablement() {
599
- let previous = false;
600
- const collapsesDown = this.views.map((i) => (previous = i.size - i.minimumSize > 0 || previous));
601
- previous = false;
602
- const expandsDown = this.views.map((i) => (previous = i.maximumSize - i.size > 0 || previous));
603
- const reverseViews = [...this.views].reverse();
604
- previous = false;
605
- const collapsesUp = reverseViews
606
- .map((i) => (previous = i.size - i.minimumSize > 0 || previous))
607
- .reverse();
608
- previous = false;
609
- const expandsUp = reverseViews
610
- .map((i) => (previous = i.maximumSize - i.size > 0 || previous))
611
- .reverse();
612
- let position = 0;
613
- for (let index = 0; index < this.sashes.length; index++) {
614
- const sash = this.sashes[index];
615
- const viewItem = this.views[index];
616
- position += viewItem.size;
617
- const min = !(collapsesDown[index] && expandsUp[index + 1]);
618
- const max = !(expandsDown[index] && collapsesUp[index + 1]);
619
- if (min && max) {
620
- const upIndexes = range(index, -1);
621
- const downIndexes = range(index + 1, this.views.length);
622
- const snapBeforeIndex = this.findFirstSnapIndex(upIndexes);
623
- const snapAfterIndex = this.findFirstSnapIndex(downIndexes);
624
- const snappedBefore = typeof snapBeforeIndex === 'number' &&
625
- !this.views[snapBeforeIndex].visible;
626
- const snappedAfter = typeof snapAfterIndex === 'number' &&
627
- !this.views[snapAfterIndex].visible;
628
- if (snappedBefore &&
629
- collapsesUp[index] &&
630
- (position > 0 || this.startSnappingEnabled)) {
631
- this.updateSash(sash, SashState.MINIMUM);
632
- }
633
- else if (snappedAfter &&
634
- collapsesDown[index] &&
635
- (position < this.contentSize || this.endSnappingEnabled)) {
636
- this.updateSash(sash, SashState.MAXIMUM);
637
- }
638
- else {
639
- this.updateSash(sash, SashState.DISABLED);
640
- }
641
- }
642
- else if (min && !max) {
643
- this.updateSash(sash, SashState.MINIMUM);
644
- }
645
- else if (!min && max) {
646
- this.updateSash(sash, SashState.MAXIMUM);
647
- }
648
- else {
649
- this.updateSash(sash, SashState.ENABLED);
650
- }
651
- }
652
- }
653
- updateSash(sash, state) {
654
- toggleClass(sash.container, 'disabled', state === SashState.DISABLED);
655
- toggleClass(sash.container, 'enabled', state === SashState.ENABLED);
656
- toggleClass(sash.container, 'maximum', state === SashState.MAXIMUM);
657
- toggleClass(sash.container, 'minimum', state === SashState.MINIMUM);
658
- }
659
- createViewContainer() {
660
- const element = document.createElement('div');
661
- element.className = 'view-container';
662
- return element;
663
- }
664
- createSashContainer() {
665
- const element = document.createElement('div');
666
- element.className = 'sash-container';
667
- return element;
668
- }
669
- createContainer() {
670
- const element = document.createElement('div');
671
- const orientationClassname = this._orientation === Orientation.HORIZONTAL
672
- ? 'horizontal'
673
- : 'vertical';
674
- element.className = `split-view-container ${orientationClassname}`;
675
- return element;
676
- }
677
- dispose() {
678
- this._onDidSashEnd.dispose();
679
- this._onDidAddView.dispose();
680
- this._onDidRemoveView.dispose();
681
- for (let i = 0; i < this.element.children.length; i++) {
682
- if (this.element.children.item(i) === this.element) {
683
- this.element.removeChild(this.element);
684
- break;
685
- }
686
- }
687
- this.element.remove();
688
- }
689
- }
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Accreditation: This file is largly based upon the MIT licenced VSCode sourcecode found at:
3
+ * https://github.com/microsoft/vscode/tree/main/src/vs/base/browser/ui/splitview
4
+ *--------------------------------------------------------------------------------------------*/
5
+ import { removeClasses, addClasses, toggleClass, getElementsByTagName, } from '../../dom';
6
+ import { clamp } from '../../math';
7
+ import { Emitter } from '../../events';
8
+ import { pushToStart, pushToEnd, range, firstIndex } from '../../array';
9
+ import { ViewItem } from './viewItem';
10
+ export var Orientation;
11
+ (function (Orientation) {
12
+ Orientation["HORIZONTAL"] = "HORIZONTAL";
13
+ Orientation["VERTICAL"] = "VERTICAL";
14
+ })(Orientation || (Orientation = {}));
15
+ export var SashState;
16
+ (function (SashState) {
17
+ SashState[SashState["MAXIMUM"] = 0] = "MAXIMUM";
18
+ SashState[SashState["MINIMUM"] = 1] = "MINIMUM";
19
+ SashState[SashState["DISABLED"] = 2] = "DISABLED";
20
+ SashState[SashState["ENABLED"] = 3] = "ENABLED";
21
+ })(SashState || (SashState = {}));
22
+ export var LayoutPriority;
23
+ (function (LayoutPriority) {
24
+ LayoutPriority["Low"] = "low";
25
+ LayoutPriority["High"] = "high";
26
+ LayoutPriority["Normal"] = "normal";
27
+ })(LayoutPriority || (LayoutPriority = {}));
28
+ export var Sizing;
29
+ (function (Sizing) {
30
+ Sizing.Distribute = { type: 'distribute' };
31
+ function Split(index) {
32
+ return { type: 'split', index };
33
+ }
34
+ Sizing.Split = Split;
35
+ function Invisible(cachedVisibleSize) {
36
+ return { type: 'invisible', cachedVisibleSize };
37
+ }
38
+ Sizing.Invisible = Invisible;
39
+ })(Sizing || (Sizing = {}));
40
+ export class Splitview {
41
+ constructor(container, options) {
42
+ this.container = container;
43
+ this.views = [];
44
+ this.sashes = [];
45
+ this._size = 0;
46
+ this._orthogonalSize = 0;
47
+ this.contentSize = 0;
48
+ this._proportions = undefined;
49
+ this._onDidSashEnd = new Emitter();
50
+ this.onDidSashEnd = this._onDidSashEnd.event;
51
+ this._onDidAddView = new Emitter();
52
+ this.onDidAddView = this._onDidAddView.event;
53
+ this._onDidRemoveView = new Emitter();
54
+ this.onDidRemoveView = this._onDidRemoveView.event;
55
+ this._startSnappingEnabled = true;
56
+ this._endSnappingEnabled = true;
57
+ this.resize = (index, delta, sizes = this.views.map((x) => x.size), lowPriorityIndexes, highPriorityIndexes, overloadMinDelta = Number.NEGATIVE_INFINITY, overloadMaxDelta = Number.POSITIVE_INFINITY, snapBefore, snapAfter) => {
58
+ if (index < 0 || index > this.views.length) {
59
+ return 0;
60
+ }
61
+ const upIndexes = range(index, -1);
62
+ const downIndexes = range(index + 1, this.views.length);
63
+ //
64
+ if (highPriorityIndexes) {
65
+ for (const i of highPriorityIndexes) {
66
+ pushToStart(upIndexes, i);
67
+ pushToStart(downIndexes, i);
68
+ }
69
+ }
70
+ if (lowPriorityIndexes) {
71
+ for (const i of lowPriorityIndexes) {
72
+ pushToEnd(upIndexes, i);
73
+ pushToEnd(downIndexes, i);
74
+ }
75
+ }
76
+ //
77
+ const upItems = upIndexes.map((i) => this.views[i]);
78
+ const upSizes = upIndexes.map((i) => sizes[i]);
79
+ //
80
+ const downItems = downIndexes.map((i) => this.views[i]);
81
+ const downSizes = downIndexes.map((i) => sizes[i]);
82
+ //
83
+ const minDeltaUp = upIndexes.reduce((_, i) => _ + this.views[i].minimumSize - sizes[i], 0);
84
+ const maxDeltaUp = upIndexes.reduce((_, i) => _ + this.views[i].maximumSize - sizes[i], 0);
85
+ //
86
+ const maxDeltaDown = downIndexes.length === 0
87
+ ? Number.POSITIVE_INFINITY
88
+ : downIndexes.reduce((_, i) => _ + sizes[i] - this.views[i].minimumSize, 0);
89
+ const minDeltaDown = downIndexes.length === 0
90
+ ? Number.NEGATIVE_INFINITY
91
+ : downIndexes.reduce((_, i) => _ + sizes[i] - this.views[i].maximumSize, 0);
92
+ //
93
+ const minDelta = Math.max(minDeltaUp, minDeltaDown);
94
+ const maxDelta = Math.min(maxDeltaDown, maxDeltaUp);
95
+ //
96
+ let snapped = false;
97
+ if (snapBefore) {
98
+ const snapView = this.views[snapBefore.index];
99
+ const visible = delta >= snapBefore.limitDelta;
100
+ snapped = visible !== snapView.visible;
101
+ snapView.setVisible(visible, snapBefore.size);
102
+ }
103
+ if (!snapped && snapAfter) {
104
+ const snapView = this.views[snapAfter.index];
105
+ const visible = delta < snapAfter.limitDelta;
106
+ snapped = visible !== snapView.visible;
107
+ snapView.setVisible(visible, snapAfter.size);
108
+ }
109
+ if (snapped) {
110
+ return this.resize(index, delta, sizes, lowPriorityIndexes, highPriorityIndexes, overloadMinDelta, overloadMaxDelta);
111
+ }
112
+ //
113
+ const tentativeDelta = clamp(delta, minDelta, maxDelta);
114
+ let actualDelta = 0;
115
+ //
116
+ let deltaUp = tentativeDelta;
117
+ for (let i = 0; i < upItems.length; i++) {
118
+ const item = upItems[i];
119
+ const size = clamp(upSizes[i] + deltaUp, item.minimumSize, item.maximumSize);
120
+ const viewDelta = size - upSizes[i];
121
+ actualDelta += viewDelta;
122
+ deltaUp -= viewDelta;
123
+ item.size = size;
124
+ }
125
+ //
126
+ let deltaDown = actualDelta;
127
+ for (let i = 0; i < downItems.length; i++) {
128
+ const item = downItems[i];
129
+ const size = clamp(downSizes[i] - deltaDown, item.minimumSize, item.maximumSize);
130
+ const viewDelta = size - downSizes[i];
131
+ deltaDown += viewDelta;
132
+ item.size = size;
133
+ }
134
+ //
135
+ return delta;
136
+ };
137
+ this._orientation = options.orientation;
138
+ this.element = this.createContainer();
139
+ this.proportionalLayout =
140
+ options.proportionalLayout === undefined
141
+ ? true
142
+ : !!options.proportionalLayout;
143
+ this.viewContainer = this.createViewContainer();
144
+ this.sashContainer = this.createSashContainer();
145
+ this.element.appendChild(this.sashContainer);
146
+ this.element.appendChild(this.viewContainer);
147
+ this.container.appendChild(this.element);
148
+ this.style(options.styles);
149
+ // We have an existing set of view, add them now
150
+ if (options.descriptor) {
151
+ this._size = options.descriptor.size;
152
+ options.descriptor.views.forEach((viewDescriptor, index) => {
153
+ const sizing = viewDescriptor.visible === undefined ||
154
+ viewDescriptor.visible
155
+ ? viewDescriptor.size
156
+ : {
157
+ type: 'invisible',
158
+ cachedVisibleSize: viewDescriptor.size,
159
+ };
160
+ const view = viewDescriptor.view;
161
+ this.addView(view, sizing, index, true
162
+ // true skip layout
163
+ );
164
+ });
165
+ // Initialize content size and proportions for first layout
166
+ this.contentSize = this.views.reduce((r, i) => r + i.size, 0);
167
+ this.saveProportions();
168
+ }
169
+ }
170
+ get size() {
171
+ return this._size;
172
+ }
173
+ set size(value) {
174
+ this._size = value;
175
+ }
176
+ get orthogonalSize() {
177
+ return this._orthogonalSize;
178
+ }
179
+ set orthogonalSize(value) {
180
+ this._orthogonalSize = value;
181
+ }
182
+ get length() {
183
+ return this.views.length;
184
+ }
185
+ get proportions() {
186
+ return this._proportions ? [...this._proportions] : undefined;
187
+ }
188
+ get orientation() {
189
+ return this._orientation;
190
+ }
191
+ set orientation(value) {
192
+ this._orientation = value;
193
+ const tmp = this.size;
194
+ this.size = this.orthogonalSize;
195
+ this.orthogonalSize = tmp;
196
+ removeClasses(this.element, 'horizontal', 'vertical');
197
+ this.element.classList.add(this.orientation == Orientation.HORIZONTAL
198
+ ? 'horizontal'
199
+ : 'vertical');
200
+ }
201
+ get minimumSize() {
202
+ return this.views.reduce((r, item) => r + item.minimumSize, 0);
203
+ }
204
+ get maximumSize() {
205
+ return this.length === 0
206
+ ? Number.POSITIVE_INFINITY
207
+ : this.views.reduce((r, item) => r + item.maximumSize, 0);
208
+ }
209
+ get startSnappingEnabled() {
210
+ return this._startSnappingEnabled;
211
+ }
212
+ set startSnappingEnabled(startSnappingEnabled) {
213
+ if (this._startSnappingEnabled === startSnappingEnabled) {
214
+ return;
215
+ }
216
+ this._startSnappingEnabled = startSnappingEnabled;
217
+ this.updateSashEnablement();
218
+ }
219
+ get endSnappingEnabled() {
220
+ return this._endSnappingEnabled;
221
+ }
222
+ set endSnappingEnabled(endSnappingEnabled) {
223
+ if (this._endSnappingEnabled === endSnappingEnabled) {
224
+ return;
225
+ }
226
+ this._endSnappingEnabled = endSnappingEnabled;
227
+ this.updateSashEnablement();
228
+ }
229
+ style(styles) {
230
+ if ((styles === null || styles === void 0 ? void 0 : styles.separatorBorder) === 'transparent') {
231
+ removeClasses(this.element, 'separator-border');
232
+ this.element.style.removeProperty('--dv-separator-border');
233
+ }
234
+ else {
235
+ addClasses(this.element, 'separator-border');
236
+ if (styles === null || styles === void 0 ? void 0 : styles.separatorBorder) {
237
+ this.element.style.setProperty('--dv-separator-border', styles.separatorBorder);
238
+ }
239
+ }
240
+ }
241
+ isViewVisible(index) {
242
+ if (index < 0 || index >= this.views.length) {
243
+ throw new Error('Index out of bounds');
244
+ }
245
+ const viewItem = this.views[index];
246
+ return viewItem.visible;
247
+ }
248
+ setViewVisible(index, visible) {
249
+ if (index < 0 || index >= this.views.length) {
250
+ throw new Error('Index out of bounds');
251
+ }
252
+ toggleClass(this.container, 'visible', visible);
253
+ const viewItem = this.views[index];
254
+ toggleClass(this.container, 'visible', visible);
255
+ viewItem.setVisible(visible, viewItem.size);
256
+ this.distributeEmptySpace(index);
257
+ this.layoutViews();
258
+ this.saveProportions();
259
+ }
260
+ getViewSize(index) {
261
+ if (index < 0 || index >= this.views.length) {
262
+ return -1;
263
+ }
264
+ return this.views[index].size;
265
+ }
266
+ resizeView(index, size) {
267
+ if (index < 0 || index >= this.views.length) {
268
+ return;
269
+ }
270
+ const indexes = range(this.views.length).filter((i) => i !== index);
271
+ const lowPriorityIndexes = [
272
+ ...indexes.filter((i) => this.views[i].priority === LayoutPriority.Low),
273
+ index,
274
+ ];
275
+ const highPriorityIndexes = indexes.filter((i) => this.views[i].priority === LayoutPriority.High);
276
+ const item = this.views[index];
277
+ size = Math.round(size);
278
+ size = clamp(size, item.minimumSize, Math.min(item.maximumSize, this._size));
279
+ item.size = size;
280
+ this.relayout(lowPriorityIndexes, highPriorityIndexes);
281
+ }
282
+ getViews() {
283
+ return this.views.map((x) => x.view);
284
+ }
285
+ onDidChange(item, size) {
286
+ const index = this.views.indexOf(item);
287
+ if (index < 0 || index >= this.views.length) {
288
+ return;
289
+ }
290
+ size = typeof size === 'number' ? size : item.size;
291
+ size = clamp(size, item.minimumSize, item.maximumSize);
292
+ item.size = size;
293
+ this.relayout([index]);
294
+ }
295
+ addView(view, size = { type: 'distribute' }, index = this.views.length, skipLayout) {
296
+ const container = document.createElement('div');
297
+ container.className = 'view';
298
+ container.appendChild(view.element);
299
+ let viewSize;
300
+ if (typeof size === 'number') {
301
+ viewSize = size;
302
+ }
303
+ else if (size.type === 'split') {
304
+ viewSize = this.getViewSize(size.index) / 2;
305
+ }
306
+ else if (size.type === 'invisible') {
307
+ viewSize = { cachedVisibleSize: size.cachedVisibleSize };
308
+ }
309
+ else {
310
+ viewSize = view.minimumSize;
311
+ }
312
+ const disposable = view.onDidChange((newSize) => this.onDidChange(viewItem, newSize.size));
313
+ const dispose = () => {
314
+ disposable === null || disposable === void 0 ? void 0 : disposable.dispose();
315
+ this.viewContainer.removeChild(container);
316
+ };
317
+ const viewItem = new ViewItem(container, view, viewSize, { dispose });
318
+ if (index === this.views.length) {
319
+ this.viewContainer.appendChild(container);
320
+ }
321
+ else {
322
+ this.viewContainer.insertBefore(container, this.viewContainer.children.item(index));
323
+ }
324
+ this.views.splice(index, 0, viewItem);
325
+ if (this.views.length > 1) {
326
+ //add sash
327
+ const sash = document.createElement('div');
328
+ sash.className = 'sash';
329
+ const onStart = (event) => {
330
+ for (const item of this.views) {
331
+ item.enabled = false;
332
+ }
333
+ const iframes = [
334
+ ...getElementsByTagName('iframe'),
335
+ ...getElementsByTagName('webview'),
336
+ ];
337
+ for (const iframe of iframes) {
338
+ iframe.style.pointerEvents = 'none';
339
+ }
340
+ const start = this._orientation === Orientation.HORIZONTAL
341
+ ? event.clientX
342
+ : event.clientY;
343
+ const sashIndex = firstIndex(this.sashes, (s) => s.container === sash);
344
+ //
345
+ const sizes = this.views.map((x) => x.size);
346
+ //
347
+ let snapBefore;
348
+ let snapAfter;
349
+ const upIndexes = range(sashIndex, -1);
350
+ const downIndexes = range(sashIndex + 1, this.views.length);
351
+ const minDeltaUp = upIndexes.reduce((r, i) => r + (this.views[i].minimumSize - sizes[i]), 0);
352
+ const maxDeltaUp = upIndexes.reduce((r, i) => r + (this.views[i].viewMaximumSize - sizes[i]), 0);
353
+ const maxDeltaDown = downIndexes.length === 0
354
+ ? Number.POSITIVE_INFINITY
355
+ : downIndexes.reduce((r, i) => r + (sizes[i] - this.views[i].minimumSize), 0);
356
+ const minDeltaDown = downIndexes.length === 0
357
+ ? Number.NEGATIVE_INFINITY
358
+ : downIndexes.reduce((r, i) => r +
359
+ (sizes[i] - this.views[i].viewMaximumSize), 0);
360
+ const minDelta = Math.max(minDeltaUp, minDeltaDown);
361
+ const maxDelta = Math.min(maxDeltaDown, maxDeltaUp);
362
+ const snapBeforeIndex = this.findFirstSnapIndex(upIndexes);
363
+ const snapAfterIndex = this.findFirstSnapIndex(downIndexes);
364
+ if (typeof snapBeforeIndex === 'number') {
365
+ const snappedViewItem = this.views[snapBeforeIndex];
366
+ const halfSize = Math.floor(snappedViewItem.viewMinimumSize / 2);
367
+ snapBefore = {
368
+ index: snapBeforeIndex,
369
+ limitDelta: snappedViewItem.visible
370
+ ? minDelta - halfSize
371
+ : minDelta + halfSize,
372
+ size: snappedViewItem.size,
373
+ };
374
+ }
375
+ if (typeof snapAfterIndex === 'number') {
376
+ const snappedViewItem = this.views[snapAfterIndex];
377
+ const halfSize = Math.floor(snappedViewItem.viewMinimumSize / 2);
378
+ snapAfter = {
379
+ index: snapAfterIndex,
380
+ limitDelta: snappedViewItem.visible
381
+ ? maxDelta + halfSize
382
+ : maxDelta - halfSize,
383
+ size: snappedViewItem.size,
384
+ };
385
+ }
386
+ //
387
+ const mousemove = (mousemoveEvent) => {
388
+ const current = this._orientation === Orientation.HORIZONTAL
389
+ ? mousemoveEvent.clientX
390
+ : mousemoveEvent.clientY;
391
+ const delta = current - start;
392
+ this.resize(sashIndex, delta, sizes, undefined, undefined, minDelta, maxDelta, snapBefore, snapAfter);
393
+ this.distributeEmptySpace();
394
+ this.layoutViews();
395
+ };
396
+ const end = () => {
397
+ for (const item of this.views) {
398
+ item.enabled = true;
399
+ }
400
+ for (const iframe of iframes) {
401
+ iframe.style.pointerEvents = 'auto';
402
+ }
403
+ this.saveProportions();
404
+ document.removeEventListener('mousemove', mousemove);
405
+ document.removeEventListener('mouseup', end);
406
+ document.removeEventListener('mouseend', end);
407
+ this._onDidSashEnd.fire(undefined);
408
+ };
409
+ document.addEventListener('mousemove', mousemove);
410
+ document.addEventListener('mouseup', end);
411
+ document.addEventListener('mouseend', end);
412
+ };
413
+ sash.addEventListener('mousedown', onStart);
414
+ const sashItem = {
415
+ container: sash,
416
+ disposable: () => {
417
+ sash.removeEventListener('mousedown', onStart);
418
+ this.sashContainer.removeChild(sash);
419
+ },
420
+ };
421
+ this.sashContainer.appendChild(sash);
422
+ this.sashes.push(sashItem);
423
+ }
424
+ if (!skipLayout) {
425
+ this.relayout([index]);
426
+ }
427
+ if (!skipLayout &&
428
+ typeof size !== 'number' &&
429
+ size.type === 'distribute') {
430
+ this.distributeViewSizes();
431
+ }
432
+ this._onDidAddView.fire(view);
433
+ }
434
+ distributeViewSizes() {
435
+ const flexibleViewItems = [];
436
+ let flexibleSize = 0;
437
+ for (const item of this.views) {
438
+ if (item.maximumSize - item.minimumSize > 0) {
439
+ flexibleViewItems.push(item);
440
+ flexibleSize += item.size;
441
+ }
442
+ }
443
+ const size = Math.floor(flexibleSize / flexibleViewItems.length);
444
+ for (const item of flexibleViewItems) {
445
+ item.size = clamp(size, item.minimumSize, item.maximumSize);
446
+ }
447
+ const indexes = range(this.views.length);
448
+ const lowPriorityIndexes = indexes.filter((i) => this.views[i].priority === LayoutPriority.Low);
449
+ const highPriorityIndexes = indexes.filter((i) => this.views[i].priority === LayoutPriority.High);
450
+ this.relayout(lowPriorityIndexes, highPriorityIndexes);
451
+ }
452
+ removeView(index, sizing, skipLayout = false) {
453
+ // Remove view
454
+ const viewItem = this.views.splice(index, 1)[0];
455
+ viewItem.dispose();
456
+ // Remove sash
457
+ if (this.views.length >= 1) {
458
+ const sashIndex = Math.max(index - 1, 0);
459
+ const sashItem = this.sashes.splice(sashIndex, 1)[0];
460
+ sashItem.disposable();
461
+ }
462
+ if (!skipLayout) {
463
+ this.relayout();
464
+ }
465
+ if (sizing && sizing.type === 'distribute') {
466
+ this.distributeViewSizes();
467
+ }
468
+ this._onDidRemoveView.fire(viewItem.view);
469
+ return viewItem.view;
470
+ }
471
+ getViewCachedVisibleSize(index) {
472
+ if (index < 0 || index >= this.views.length) {
473
+ throw new Error('Index out of bounds');
474
+ }
475
+ const viewItem = this.views[index];
476
+ return viewItem.cachedVisibleSize;
477
+ }
478
+ moveView(from, to) {
479
+ const cachedVisibleSize = this.getViewCachedVisibleSize(from);
480
+ const sizing = typeof cachedVisibleSize === 'undefined'
481
+ ? this.getViewSize(from)
482
+ : Sizing.Invisible(cachedVisibleSize);
483
+ const view = this.removeView(from, undefined, true);
484
+ this.addView(view, sizing, to);
485
+ }
486
+ layout(size, orthogonalSize) {
487
+ const previousSize = Math.max(this.size, this.contentSize);
488
+ this.size = size;
489
+ this.orthogonalSize = orthogonalSize;
490
+ if (!this.proportions) {
491
+ const indexes = range(this.views.length);
492
+ const lowPriorityIndexes = indexes.filter((i) => this.views[i].priority === LayoutPriority.Low);
493
+ const highPriorityIndexes = indexes.filter((i) => this.views[i].priority === LayoutPriority.High);
494
+ this.resize(this.views.length - 1, size - previousSize, undefined, lowPriorityIndexes, highPriorityIndexes);
495
+ }
496
+ else {
497
+ for (let i = 0; i < this.views.length; i++) {
498
+ const item = this.views[i];
499
+ item.size = clamp(Math.round(this.proportions[i] * size), item.minimumSize, item.maximumSize);
500
+ }
501
+ }
502
+ this.distributeEmptySpace();
503
+ this.layoutViews();
504
+ }
505
+ relayout(lowPriorityIndexes, highPriorityIndexes) {
506
+ const contentSize = this.views.reduce((r, i) => r + i.size, 0);
507
+ this.resize(this.views.length - 1, this._size - contentSize, undefined, lowPriorityIndexes, highPriorityIndexes);
508
+ this.distributeEmptySpace();
509
+ this.layoutViews();
510
+ this.saveProportions();
511
+ }
512
+ distributeEmptySpace(lowPriorityIndex) {
513
+ const contentSize = this.views.reduce((r, i) => r + i.size, 0);
514
+ let emptyDelta = this.size - contentSize;
515
+ const indexes = range(this.views.length - 1, -1);
516
+ const lowPriorityIndexes = indexes.filter((i) => this.views[i].priority === LayoutPriority.Low);
517
+ const highPriorityIndexes = indexes.filter((i) => this.views[i].priority === LayoutPriority.High);
518
+ for (const index of highPriorityIndexes) {
519
+ pushToStart(indexes, index);
520
+ }
521
+ for (const index of lowPriorityIndexes) {
522
+ pushToEnd(indexes, index);
523
+ }
524
+ if (typeof lowPriorityIndex === 'number') {
525
+ pushToEnd(indexes, lowPriorityIndex);
526
+ }
527
+ for (let i = 0; emptyDelta !== 0 && i < indexes.length; i++) {
528
+ const item = this.views[indexes[i]];
529
+ const size = clamp(item.size + emptyDelta, item.minimumSize, item.maximumSize);
530
+ const viewDelta = size - item.size;
531
+ emptyDelta -= viewDelta;
532
+ item.size = size;
533
+ }
534
+ }
535
+ saveProportions() {
536
+ if (this.proportionalLayout && this.contentSize > 0) {
537
+ this._proportions = this.views.map((i) => i.size / this.contentSize);
538
+ }
539
+ }
540
+ layoutViews() {
541
+ this.contentSize = this.views.reduce((r, i) => r + i.size, 0);
542
+ let sum = 0;
543
+ const x = [];
544
+ this.updateSashEnablement();
545
+ for (let i = 0; i < this.views.length - 1; i++) {
546
+ sum += this.views[i].size;
547
+ x.push(sum);
548
+ const offset = Math.min(Math.max(0, sum - 2), this.size - 4);
549
+ if (this._orientation === Orientation.HORIZONTAL) {
550
+ this.sashes[i].container.style.left = `${offset}px`;
551
+ this.sashes[i].container.style.top = `0px`;
552
+ }
553
+ if (this._orientation === Orientation.VERTICAL) {
554
+ this.sashes[i].container.style.left = `0px`;
555
+ this.sashes[i].container.style.top = `${offset}px`;
556
+ }
557
+ }
558
+ this.views.forEach((view, i) => {
559
+ if (this._orientation === Orientation.HORIZONTAL) {
560
+ view.container.style.width = `${view.size}px`;
561
+ view.container.style.left = i == 0 ? '0px' : `${x[i - 1]}px`;
562
+ view.container.style.top = '';
563
+ view.container.style.height = '';
564
+ }
565
+ if (this._orientation === Orientation.VERTICAL) {
566
+ view.container.style.height = `${view.size}px`;
567
+ view.container.style.top = i == 0 ? '0px' : `${x[i - 1]}px`;
568
+ view.container.style.width = '';
569
+ view.container.style.left = '';
570
+ }
571
+ view.view.layout(view.size, this._orthogonalSize);
572
+ });
573
+ }
574
+ findFirstSnapIndex(indexes) {
575
+ // visible views first
576
+ for (const index of indexes) {
577
+ const viewItem = this.views[index];
578
+ if (!viewItem.visible) {
579
+ continue;
580
+ }
581
+ if (viewItem.snap) {
582
+ return index;
583
+ }
584
+ }
585
+ // then, hidden views
586
+ for (const index of indexes) {
587
+ const viewItem = this.views[index];
588
+ if (viewItem.visible &&
589
+ viewItem.maximumSize - viewItem.minimumSize > 0) {
590
+ return undefined;
591
+ }
592
+ if (!viewItem.visible && viewItem.snap) {
593
+ return index;
594
+ }
595
+ }
596
+ return undefined;
597
+ }
598
+ updateSashEnablement() {
599
+ let previous = false;
600
+ const collapsesDown = this.views.map((i) => (previous = i.size - i.minimumSize > 0 || previous));
601
+ previous = false;
602
+ const expandsDown = this.views.map((i) => (previous = i.maximumSize - i.size > 0 || previous));
603
+ const reverseViews = [...this.views].reverse();
604
+ previous = false;
605
+ const collapsesUp = reverseViews
606
+ .map((i) => (previous = i.size - i.minimumSize > 0 || previous))
607
+ .reverse();
608
+ previous = false;
609
+ const expandsUp = reverseViews
610
+ .map((i) => (previous = i.maximumSize - i.size > 0 || previous))
611
+ .reverse();
612
+ let position = 0;
613
+ for (let index = 0; index < this.sashes.length; index++) {
614
+ const sash = this.sashes[index];
615
+ const viewItem = this.views[index];
616
+ position += viewItem.size;
617
+ const min = !(collapsesDown[index] && expandsUp[index + 1]);
618
+ const max = !(expandsDown[index] && collapsesUp[index + 1]);
619
+ if (min && max) {
620
+ const upIndexes = range(index, -1);
621
+ const downIndexes = range(index + 1, this.views.length);
622
+ const snapBeforeIndex = this.findFirstSnapIndex(upIndexes);
623
+ const snapAfterIndex = this.findFirstSnapIndex(downIndexes);
624
+ const snappedBefore = typeof snapBeforeIndex === 'number' &&
625
+ !this.views[snapBeforeIndex].visible;
626
+ const snappedAfter = typeof snapAfterIndex === 'number' &&
627
+ !this.views[snapAfterIndex].visible;
628
+ if (snappedBefore &&
629
+ collapsesUp[index] &&
630
+ (position > 0 || this.startSnappingEnabled)) {
631
+ this.updateSash(sash, SashState.MINIMUM);
632
+ }
633
+ else if (snappedAfter &&
634
+ collapsesDown[index] &&
635
+ (position < this.contentSize || this.endSnappingEnabled)) {
636
+ this.updateSash(sash, SashState.MAXIMUM);
637
+ }
638
+ else {
639
+ this.updateSash(sash, SashState.DISABLED);
640
+ }
641
+ }
642
+ else if (min && !max) {
643
+ this.updateSash(sash, SashState.MINIMUM);
644
+ }
645
+ else if (!min && max) {
646
+ this.updateSash(sash, SashState.MAXIMUM);
647
+ }
648
+ else {
649
+ this.updateSash(sash, SashState.ENABLED);
650
+ }
651
+ }
652
+ }
653
+ updateSash(sash, state) {
654
+ toggleClass(sash.container, 'disabled', state === SashState.DISABLED);
655
+ toggleClass(sash.container, 'enabled', state === SashState.ENABLED);
656
+ toggleClass(sash.container, 'maximum', state === SashState.MAXIMUM);
657
+ toggleClass(sash.container, 'minimum', state === SashState.MINIMUM);
658
+ }
659
+ createViewContainer() {
660
+ const element = document.createElement('div');
661
+ element.className = 'view-container';
662
+ return element;
663
+ }
664
+ createSashContainer() {
665
+ const element = document.createElement('div');
666
+ element.className = 'sash-container';
667
+ return element;
668
+ }
669
+ createContainer() {
670
+ const element = document.createElement('div');
671
+ const orientationClassname = this._orientation === Orientation.HORIZONTAL
672
+ ? 'horizontal'
673
+ : 'vertical';
674
+ element.className = `split-view-container ${orientationClassname}`;
675
+ return element;
676
+ }
677
+ dispose() {
678
+ this._onDidSashEnd.dispose();
679
+ this._onDidAddView.dispose();
680
+ this._onDidRemoveView.dispose();
681
+ for (let i = 0; i < this.element.children.length; i++) {
682
+ if (this.element.children.item(i) === this.element) {
683
+ this.element.removeChild(this.element);
684
+ break;
685
+ }
686
+ }
687
+ this.element.remove();
688
+ }
689
+ }