dockview-core 1.8.4 → 1.8.5

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