dockview 1.5.1 → 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.
- package/LICENSE +21 -21
- package/README.md +52 -52
- package/dist/cjs/actionbar/actionsContainer.d.ts +7 -7
- package/dist/cjs/actionbar/actionsContainer.js +26 -26
- package/dist/cjs/api/component.api.d.ts +144 -144
- package/dist/cjs/api/component.api.js +571 -571
- package/dist/cjs/api/gridviewPanelApi.d.ts +36 -36
- package/dist/cjs/api/gridviewPanelApi.js +47 -47
- package/dist/cjs/api/groupPanelApi.d.ts +34 -34
- package/dist/cjs/api/groupPanelApi.js +85 -85
- package/dist/cjs/api/panelApi.d.ts +81 -81
- package/dist/cjs/api/panelApi.js +121 -121
- package/dist/cjs/api/paneviewPanelApi.d.ts +26 -26
- package/dist/cjs/api/paneviewPanelApi.js +57 -57
- package/dist/cjs/api/splitviewPanelApi.d.ts +32 -32
- package/dist/cjs/api/splitviewPanelApi.js +47 -47
- package/dist/cjs/array.d.ts +13 -13
- package/dist/cjs/array.js +77 -77
- package/dist/cjs/dnd/abstractDragHandler.d.ts +11 -11
- package/dist/cjs/dnd/abstractDragHandler.js +115 -115
- package/dist/cjs/dnd/dataTransfer.d.ts +31 -31
- package/dist/cjs/dnd/dataTransfer.js +100 -100
- package/dist/cjs/dnd/dnd.d.ts +27 -27
- package/dist/cjs/dnd/dnd.js +64 -64
- package/dist/cjs/dnd/droptarget.d.ts +37 -37
- package/dist/cjs/dnd/droptarget.js +201 -201
- package/dist/cjs/dockview/components/tab/defaultTab.d.ts +27 -27
- package/dist/cjs/dockview/components/tab/defaultTab.js +121 -121
- package/dist/cjs/dockview/components/watermark/watermark.d.ts +20 -20
- package/dist/cjs/dockview/components/watermark/watermark.js +101 -101
- package/dist/cjs/dockview/defaultGroupPanelView.d.ts +29 -29
- package/dist/cjs/dockview/defaultGroupPanelView.js +68 -68
- package/dist/cjs/dockview/deserializer.d.ts +5 -5
- package/dist/cjs/dockview/deserializer.js +2 -2
- package/dist/cjs/dockview/dockviewComponent.d.ts +125 -125
- package/dist/cjs/dockview/dockviewComponent.js +614 -614
- package/dist/cjs/dockview/dockviewComponent.js.map +1 -1
- package/dist/cjs/dockview/dockviewGroupPanel.d.ts +31 -31
- package/dist/cjs/dockview/dockviewGroupPanel.js +156 -156
- package/dist/cjs/dockview/options.d.ts +88 -88
- package/dist/cjs/dockview/options.js +2 -2
- package/dist/cjs/dom.d.ts +14 -14
- package/dist/cjs/dom.js +182 -182
- package/dist/cjs/events.d.ts +30 -30
- package/dist/cjs/events.js +129 -129
- package/dist/cjs/gridview/baseComponentGridview.d.ts +87 -87
- package/dist/cjs/gridview/baseComponentGridview.js +279 -279
- package/dist/cjs/gridview/basePanelView.d.ts +43 -43
- package/dist/cjs/gridview/basePanelView.js +123 -123
- package/dist/cjs/gridview/branchNode.d.ts +49 -46
- package/dist/cjs/gridview/branchNode.js +342 -342
- package/dist/cjs/gridview/branchNode.js.map +1 -1
- package/dist/cjs/gridview/gridview.d.ts +126 -123
- package/dist/cjs/gridview/gridview.js +479 -479
- package/dist/cjs/gridview/gridview.js.map +1 -1
- package/dist/cjs/gridview/gridviewComponent.d.ts +85 -85
- package/dist/cjs/gridview/gridviewComponent.js +325 -325
- package/dist/cjs/gridview/gridviewPanel.d.ts +60 -60
- package/dist/cjs/gridview/gridviewPanel.js +202 -202
- package/dist/cjs/gridview/leafNode.d.ts +34 -31
- package/dist/cjs/gridview/leafNode.js +170 -165
- package/dist/cjs/gridview/leafNode.js.map +1 -1
- package/dist/cjs/gridview/options.d.ts +18 -18
- package/dist/cjs/gridview/options.js +2 -2
- package/dist/cjs/gridview/types.d.ts +3 -3
- package/dist/cjs/gridview/types.js +2 -2
- package/dist/cjs/groupview/dnd.d.ts +5 -5
- package/dist/cjs/groupview/dnd.js +9 -9
- package/dist/cjs/groupview/groupPanel.d.ts +32 -32
- package/dist/cjs/groupview/groupPanel.js +2 -2
- package/dist/cjs/groupview/groupview.d.ts +177 -177
- package/dist/cjs/groupview/groupview.js +589 -589
- package/dist/cjs/groupview/groupviewPanel.d.ts +35 -35
- package/dist/cjs/groupview/groupviewPanel.js +128 -128
- package/dist/cjs/groupview/panel/content.d.ts +30 -30
- package/dist/cjs/groupview/panel/content.js +100 -100
- package/dist/cjs/groupview/tab.d.ts +41 -41
- package/dist/cjs/groupview/tab.js +120 -120
- package/dist/cjs/groupview/titlebar/tabsContainer.d.ts +68 -68
- package/dist/cjs/groupview/titlebar/tabsContainer.js +258 -258
- package/dist/cjs/groupview/types.d.ts +52 -52
- package/dist/cjs/groupview/types.js +2 -2
- package/dist/cjs/hostedContainer.d.ts +23 -23
- package/dist/cjs/hostedContainer.js +73 -73
- package/dist/cjs/index.d.ts +30 -30
- package/dist/cjs/index.js +46 -46
- package/dist/cjs/lifecycle.d.ts +22 -22
- package/dist/cjs/lifecycle.js +88 -88
- package/dist/cjs/math.d.ts +4 -4
- package/dist/cjs/math.js +15 -15
- package/dist/cjs/panel/componentFactory.d.ts +8 -8
- package/dist/cjs/panel/componentFactory.js +30 -30
- package/dist/cjs/panel/types.d.ts +33 -33
- package/dist/cjs/panel/types.js +2 -2
- package/dist/cjs/paneview/defaultPaneviewHeader.d.ts +21 -21
- package/dist/cjs/paneview/defaultPaneviewHeader.js +90 -90
- package/dist/cjs/paneview/draggablePaneviewPanel.d.ts +19 -19
- package/dist/cjs/paneview/draggablePaneviewPanel.js +129 -129
- package/dist/cjs/paneview/options.d.ts +27 -27
- package/dist/cjs/paneview/options.js +2 -2
- package/dist/cjs/paneview/paneview.d.ts +40 -40
- package/dist/cjs/paneview/paneview.js +201 -201
- package/dist/cjs/paneview/paneviewComponent.d.ts +129 -129
- package/dist/cjs/paneview/paneviewComponent.js +394 -394
- package/dist/cjs/paneview/paneviewPanel.d.ts +92 -89
- package/dist/cjs/paneview/paneviewPanel.js +274 -274
- package/dist/cjs/paneview/paneviewPanel.js.map +1 -1
- package/dist/cjs/react/deserializer.d.ts +9 -9
- package/dist/cjs/react/deserializer.js +43 -43
- package/dist/cjs/react/dockview/defaultTab.d.ts +4 -4
- package/dist/cjs/react/dockview/defaultTab.js +72 -72
- package/dist/cjs/react/dockview/dockview.d.ts +34 -34
- package/dist/cjs/react/dockview/dockview.js +212 -212
- package/dist/cjs/react/dockview/groupControlsRenderer.d.ts +43 -43
- package/dist/cjs/react/dockview/groupControlsRenderer.js +86 -86
- package/dist/cjs/react/dockview/reactContentPart.d.ts +30 -30
- package/dist/cjs/react/dockview/reactContentPart.js +58 -58
- package/dist/cjs/react/dockview/reactHeaderPart.d.ts +26 -26
- package/dist/cjs/react/dockview/reactHeaderPart.js +55 -55
- package/dist/cjs/react/dockview/reactWatermarkPart.d.ts +29 -29
- package/dist/cjs/react/dockview/reactWatermarkPart.js +65 -65
- package/dist/cjs/react/dockview/v2/reactContentRenderer.d.ts +29 -29
- package/dist/cjs/react/dockview/v2/reactContentRenderer.js +87 -87
- package/dist/cjs/react/dockview/v2/reactGroupPanelView.d.ts +7 -7
- package/dist/cjs/react/dockview/v2/reactGroupPanelView.js +34 -34
- package/dist/cjs/react/dockview/v2/webviewContentRenderer.d.ts +18 -18
- package/dist/cjs/react/dockview/v2/webviewContentRenderer.js +45 -45
- package/dist/cjs/react/gridview/gridview.d.ts +24 -24
- package/dist/cjs/react/gridview/gridview.js +112 -112
- package/dist/cjs/react/gridview/view.d.ts +11 -11
- package/dist/cjs/react/gridview/view.js +40 -40
- package/dist/cjs/react/index.d.ts +9 -9
- package/dist/cjs/react/index.js +23 -23
- package/dist/cjs/react/paneview/paneview.d.ts +30 -30
- package/dist/cjs/react/paneview/paneview.js +155 -155
- package/dist/cjs/react/paneview/view.d.ts +20 -20
- package/dist/cjs/react/paneview/view.js +44 -44
- package/dist/cjs/react/react.d.ts +36 -36
- package/dist/cjs/react/react.js +194 -194
- package/dist/cjs/react/splitview/splitview.d.ts +24 -24
- package/dist/cjs/react/splitview/splitview.js +108 -108
- package/dist/cjs/react/splitview/view.d.ts +10 -10
- package/dist/cjs/react/splitview/view.js +40 -40
- package/dist/cjs/react/svg.d.ts +3 -3
- package/dist/cjs/react/svg.js +35 -35
- package/dist/cjs/react/types.d.ts +7 -7
- package/dist/cjs/react/types.js +2 -2
- package/dist/cjs/splitview/core/options.d.ts +26 -26
- package/dist/cjs/splitview/core/options.js +2 -2
- package/dist/cjs/splitview/core/splitview.d.ts +127 -124
- package/dist/cjs/splitview/core/splitview.js +908 -908
- package/dist/cjs/splitview/core/splitview.js.map +1 -1
- package/dist/cjs/splitview/core/viewItem.d.ts +25 -25
- package/dist/cjs/splitview/core/viewItem.js +124 -124
- package/dist/cjs/splitview/splitviewComponent.d.ts +101 -101
- package/dist/cjs/splitview/splitviewComponent.js +373 -373
- package/dist/cjs/splitview/splitviewPanel.d.ts +45 -42
- package/dist/cjs/splitview/splitviewPanel.js +178 -178
- package/dist/cjs/splitview/splitviewPanel.js.map +1 -1
- package/dist/cjs/svg.d.ts +3 -3
- package/dist/cjs/svg.js +43 -43
- package/dist/cjs/types.d.ts +7 -7
- package/dist/cjs/types.js +2 -2
- package/dist/dockview.amd.js +6737 -6732
- package/dist/dockview.amd.min.js +2 -2
- package/dist/dockview.amd.min.noStyle.js +2 -2
- package/dist/dockview.amd.noStyle.js +6743 -6738
- package/dist/dockview.cjs.js +6736 -6731
- package/dist/dockview.esm.js +6731 -6726
- package/dist/dockview.esm.min.js +2 -2
- package/dist/dockview.js +6737 -6732
- package/dist/dockview.min.js +2 -2
- package/dist/dockview.min.noStyle.js +2 -2
- package/dist/dockview.noStyle.js +6743 -6738
- package/dist/esm/actionbar/actionsContainer.d.ts +7 -7
- package/dist/esm/actionbar/actionsContainer.js +17 -17
- package/dist/esm/api/component.api.d.ts +144 -144
- package/dist/esm/api/component.api.js +326 -326
- package/dist/esm/api/gridviewPanelApi.d.ts +36 -36
- package/dist/esm/api/gridviewPanelApi.js +25 -25
- package/dist/esm/api/groupPanelApi.d.ts +34 -34
- package/dist/esm/api/groupPanelApi.js +50 -50
- package/dist/esm/api/panelApi.d.ts +81 -81
- package/dist/esm/api/panelApi.js +79 -79
- package/dist/esm/api/paneviewPanelApi.d.ts +26 -26
- package/dist/esm/api/paneviewPanelApi.js +27 -27
- package/dist/esm/api/splitviewPanelApi.d.ts +32 -32
- package/dist/esm/api/splitviewPanelApi.js +25 -25
- package/dist/esm/array.d.ts +13 -13
- package/dist/esm/array.js +67 -67
- package/dist/esm/dnd/abstractDragHandler.d.ts +11 -11
- package/dist/esm/dnd/abstractDragHandler.js +37 -37
- package/dist/esm/dnd/dataTransfer.d.ts +31 -31
- package/dist/esm/dnd/dataTransfer.js +69 -69
- package/dist/esm/dnd/dnd.d.ts +27 -27
- package/dist/esm/dnd/dnd.js +41 -41
- package/dist/esm/dnd/droptarget.d.ts +37 -37
- package/dist/esm/dnd/droptarget.js +167 -167
- package/dist/esm/dockview/components/tab/defaultTab.d.ts +27 -27
- package/dist/esm/dockview/components/tab/defaultTab.js +79 -79
- package/dist/esm/dockview/components/watermark/watermark.d.ts +20 -20
- package/dist/esm/dockview/components/watermark/watermark.js +70 -70
- package/dist/esm/dockview/defaultGroupPanelView.d.ts +29 -29
- package/dist/esm/dockview/defaultGroupPanelView.js +44 -44
- package/dist/esm/dockview/deserializer.d.ts +5 -5
- package/dist/esm/dockview/deserializer.js +1 -1
- package/dist/esm/dockview/dockviewComponent.d.ts +125 -125
- package/dist/esm/dockview/dockviewComponent.js +468 -468
- package/dist/esm/dockview/dockviewGroupPanel.d.ts +31 -31
- package/dist/esm/dockview/dockviewGroupPanel.js +107 -107
- package/dist/esm/dockview/options.d.ts +88 -88
- package/dist/esm/dockview/options.js +1 -1
- package/dist/esm/dom.d.ts +14 -14
- package/dist/esm/dom.js +113 -113
- package/dist/esm/events.d.ts +30 -30
- package/dist/esm/events.js +88 -88
- package/dist/esm/gridview/baseComponentGridview.d.ts +87 -87
- package/dist/esm/gridview/baseComponentGridview.js +189 -189
- package/dist/esm/gridview/basePanelView.d.ts +43 -43
- package/dist/esm/gridview/basePanelView.js +74 -74
- package/dist/esm/gridview/branchNode.d.ts +49 -46
- package/dist/esm/gridview/branchNode.js +218 -218
- package/dist/esm/gridview/gridview.d.ts +126 -123
- package/dist/esm/gridview/gridview.js +397 -397
- package/dist/esm/gridview/gridviewComponent.d.ts +85 -85
- package/dist/esm/gridview/gridviewComponent.js +238 -238
- package/dist/esm/gridview/gridviewPanel.d.ts +60 -60
- package/dist/esm/gridview/gridviewPanel.js +138 -138
- package/dist/esm/gridview/leafNode.d.ts +34 -31
- package/dist/esm/gridview/leafNode.js +103 -98
- package/dist/esm/gridview/options.d.ts +18 -18
- package/dist/esm/gridview/options.js +1 -1
- package/dist/esm/gridview/types.d.ts +3 -3
- package/dist/esm/gridview/types.js +1 -1
- package/dist/esm/groupview/dnd.d.ts +5 -5
- package/dist/esm/groupview/dnd.js +6 -6
- package/dist/esm/groupview/groupPanel.d.ts +32 -32
- package/dist/esm/groupview/groupPanel.js +1 -1
- package/dist/esm/groupview/groupview.d.ts +177 -177
- package/dist/esm/groupview/groupview.js +444 -444
- package/dist/esm/groupview/groupviewPanel.d.ts +35 -35
- package/dist/esm/groupview/groupviewPanel.js +61 -61
- package/dist/esm/groupview/panel/content.d.ts +30 -30
- package/dist/esm/groupview/panel/content.js +73 -73
- package/dist/esm/groupview/tab.d.ts +41 -41
- package/dist/esm/groupview/tab.js +90 -90
- package/dist/esm/groupview/titlebar/tabsContainer.d.ts +68 -68
- package/dist/esm/groupview/titlebar/tabsContainer.js +190 -190
- package/dist/esm/groupview/types.d.ts +52 -52
- package/dist/esm/groupview/types.js +1 -1
- package/dist/esm/hostedContainer.d.ts +23 -23
- package/dist/esm/hostedContainer.js +63 -63
- package/dist/esm/index.d.ts +30 -30
- package/dist/esm/index.js +23 -23
- package/dist/esm/lifecycle.d.ts +22 -22
- package/dist/esm/lifecycle.js +39 -39
- package/dist/esm/math.d.ts +4 -4
- package/dist/esm/math.js +10 -10
- package/dist/esm/panel/componentFactory.d.ts +8 -8
- package/dist/esm/panel/componentFactory.js +24 -24
- package/dist/esm/panel/types.d.ts +33 -33
- package/dist/esm/panel/types.js +1 -1
- package/dist/esm/paneview/defaultPaneviewHeader.d.ts +21 -21
- package/dist/esm/paneview/defaultPaneviewHeader.js +63 -63
- package/dist/esm/paneview/draggablePaneviewPanel.d.ts +19 -19
- package/dist/esm/paneview/draggablePaneviewPanel.js +90 -90
- package/dist/esm/paneview/options.d.ts +27 -27
- package/dist/esm/paneview/options.js +1 -1
- package/dist/esm/paneview/paneview.d.ts +40 -40
- package/dist/esm/paneview/paneview.js +145 -145
- package/dist/esm/paneview/paneviewComponent.d.ts +129 -129
- package/dist/esm/paneview/paneviewComponent.js +270 -270
- package/dist/esm/paneview/paneviewPanel.d.ts +92 -89
- package/dist/esm/paneview/paneviewPanel.js +191 -191
- package/dist/esm/react/deserializer.d.ts +9 -9
- package/dist/esm/react/deserializer.js +38 -38
- package/dist/esm/react/dockview/defaultTab.d.ts +4 -4
- package/dist/esm/react/dockview/defaultTab.js +34 -34
- package/dist/esm/react/dockview/dockview.d.ts +34 -34
- package/dist/esm/react/dockview/dockview.js +157 -157
- package/dist/esm/react/dockview/groupControlsRenderer.d.ts +43 -43
- package/dist/esm/react/dockview/groupControlsRenderer.js +68 -68
- package/dist/esm/react/dockview/reactContentPart.d.ts +30 -30
- package/dist/esm/react/dockview/reactContentPart.js +49 -49
- package/dist/esm/react/dockview/reactHeaderPart.d.ts +26 -26
- package/dist/esm/react/dockview/reactHeaderPart.js +46 -46
- package/dist/esm/react/dockview/reactWatermarkPart.d.ts +29 -29
- package/dist/esm/react/dockview/reactWatermarkPart.js +55 -55
- package/dist/esm/react/dockview/v2/reactContentRenderer.d.ts +29 -29
- package/dist/esm/react/dockview/v2/reactContentRenderer.js +69 -69
- package/dist/esm/react/dockview/v2/reactGroupPanelView.d.ts +7 -7
- package/dist/esm/react/dockview/v2/reactGroupPanelView.js +12 -12
- package/dist/esm/react/dockview/v2/webviewContentRenderer.d.ts +18 -18
- package/dist/esm/react/dockview/v2/webviewContentRenderer.js +36 -36
- package/dist/esm/react/gridview/gridview.d.ts +24 -24
- package/dist/esm/react/gridview/gridview.js +70 -70
- package/dist/esm/react/gridview/view.d.ts +11 -11
- package/dist/esm/react/gridview/view.js +18 -18
- package/dist/esm/react/index.d.ts +9 -9
- package/dist/esm/react/index.js +7 -7
- package/dist/esm/react/paneview/paneview.d.ts +30 -30
- package/dist/esm/react/paneview/paneview.js +100 -100
- package/dist/esm/react/paneview/view.d.ts +20 -20
- package/dist/esm/react/paneview/view.js +35 -35
- package/dist/esm/react/react.d.ts +36 -36
- package/dist/esm/react/react.js +125 -125
- package/dist/esm/react/splitview/splitview.d.ts +24 -24
- package/dist/esm/react/splitview/splitview.js +66 -66
- package/dist/esm/react/splitview/view.d.ts +10 -10
- package/dist/esm/react/splitview/view.js +18 -18
- package/dist/esm/react/svg.d.ts +3 -3
- package/dist/esm/react/svg.js +7 -7
- package/dist/esm/react/types.d.ts +7 -7
- package/dist/esm/react/types.js +1 -1
- package/dist/esm/splitview/core/options.d.ts +26 -26
- package/dist/esm/splitview/core/options.js +1 -1
- package/dist/esm/splitview/core/splitview.d.ts +127 -124
- package/dist/esm/splitview/core/splitview.js +689 -689
- package/dist/esm/splitview/core/viewItem.d.ts +25 -25
- package/dist/esm/splitview/core/viewItem.js +79 -79
- package/dist/esm/splitview/splitviewComponent.d.ts +101 -101
- package/dist/esm/splitview/splitviewComponent.js +249 -249
- package/dist/esm/splitview/splitviewPanel.d.ts +45 -42
- package/dist/esm/splitview/splitviewPanel.js +107 -107
- package/dist/esm/svg.d.ts +3 -3
- package/dist/esm/svg.js +31 -31
- package/dist/esm/types.d.ts +7 -7
- package/dist/esm/types.js +1 -1
- package/package.json +2 -2
|
@@ -1,397 +1,397 @@
|
|
|
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/grid
|
|
4
|
-
*--------------------------------------------------------------------------------------------*/
|
|
5
|
-
import { Orientation, Sizing, } from '../splitview/core/splitview';
|
|
6
|
-
import { Position } from '../dnd/droptarget';
|
|
7
|
-
import { tail } from '../array';
|
|
8
|
-
import { LeafNode } from './leafNode';
|
|
9
|
-
import { BranchNode } from './branchNode';
|
|
10
|
-
import { Emitter } from '../events';
|
|
11
|
-
import { MutableDisposable } from '../lifecycle';
|
|
12
|
-
function findLeaf(candiateNode, last) {
|
|
13
|
-
if (candiateNode instanceof LeafNode) {
|
|
14
|
-
return candiateNode;
|
|
15
|
-
}
|
|
16
|
-
if (candiateNode instanceof BranchNode) {
|
|
17
|
-
return findLeaf(candiateNode.children[last ? candiateNode.children.length - 1 : 0], last);
|
|
18
|
-
}
|
|
19
|
-
throw new Error('invalid node');
|
|
20
|
-
}
|
|
21
|
-
function flipNode(node, size, orthogonalSize) {
|
|
22
|
-
if (node instanceof BranchNode) {
|
|
23
|
-
const result = new BranchNode(orthogonal(node.orientation), node.proportionalLayout, node.styles, size, orthogonalSize);
|
|
24
|
-
let totalSize = 0;
|
|
25
|
-
for (let i = node.children.length - 1; i >= 0; i--) {
|
|
26
|
-
const child = node.children[i];
|
|
27
|
-
const childSize = child instanceof BranchNode ? child.orthogonalSize : child.size;
|
|
28
|
-
let newSize = node.size === 0
|
|
29
|
-
? 0
|
|
30
|
-
: Math.round((size * childSize) / node.size);
|
|
31
|
-
totalSize += newSize;
|
|
32
|
-
// The last view to add should adjust to rounding errors
|
|
33
|
-
if (i === 0) {
|
|
34
|
-
newSize += size - totalSize;
|
|
35
|
-
}
|
|
36
|
-
result.addChild(flipNode(child, orthogonalSize, newSize), newSize, 0, true);
|
|
37
|
-
}
|
|
38
|
-
return result;
|
|
39
|
-
}
|
|
40
|
-
else {
|
|
41
|
-
return new LeafNode(node.view, orthogonal(node.orientation), orthogonalSize);
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
export function indexInParent(element) {
|
|
45
|
-
const parentElement = element.parentElement;
|
|
46
|
-
if (!parentElement) {
|
|
47
|
-
throw new Error('Invalid grid element');
|
|
48
|
-
}
|
|
49
|
-
let el = parentElement.firstElementChild;
|
|
50
|
-
let index = 0;
|
|
51
|
-
while (el !== element && el !== parentElement.lastElementChild && el) {
|
|
52
|
-
el = el.nextElementSibling;
|
|
53
|
-
index++;
|
|
54
|
-
}
|
|
55
|
-
return index;
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Find the grid location of a specific DOM element by traversing the parent
|
|
59
|
-
* chain and finding each child index on the way.
|
|
60
|
-
*
|
|
61
|
-
* This will break as soon as DOM structures of the Splitview or Gridview change.
|
|
62
|
-
*/
|
|
63
|
-
export function getGridLocation(element) {
|
|
64
|
-
const parentElement = element.parentElement;
|
|
65
|
-
if (!parentElement) {
|
|
66
|
-
throw new Error('Invalid grid element');
|
|
67
|
-
}
|
|
68
|
-
if (/\bgrid-view\b/.test(parentElement.className)) {
|
|
69
|
-
return [];
|
|
70
|
-
}
|
|
71
|
-
const index = indexInParent(parentElement);
|
|
72
|
-
const ancestor = parentElement.parentElement.parentElement.parentElement;
|
|
73
|
-
return [...getGridLocation(ancestor), index];
|
|
74
|
-
}
|
|
75
|
-
export function getRelativeLocation(rootOrientation, location, direction) {
|
|
76
|
-
const orientation = getLocationOrientation(rootOrientation, location);
|
|
77
|
-
const directionOrientation = getDirectionOrientation(direction);
|
|
78
|
-
if (orientation === directionOrientation) {
|
|
79
|
-
const [rest, _index] = tail(location);
|
|
80
|
-
let index = _index;
|
|
81
|
-
if (direction === Position.Right || direction === Position.Bottom) {
|
|
82
|
-
index += 1;
|
|
83
|
-
}
|
|
84
|
-
return [...rest, index];
|
|
85
|
-
}
|
|
86
|
-
else {
|
|
87
|
-
const index = direction === Position.Right || direction === Position.Bottom
|
|
88
|
-
? 1
|
|
89
|
-
: 0;
|
|
90
|
-
return [...location, index];
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
export function getDirectionOrientation(direction) {
|
|
94
|
-
return direction === Position.Top || direction === Position.Bottom
|
|
95
|
-
? Orientation.VERTICAL
|
|
96
|
-
: Orientation.HORIZONTAL;
|
|
97
|
-
}
|
|
98
|
-
export function getLocationOrientation(rootOrientation, location) {
|
|
99
|
-
return location.length % 2 === 0
|
|
100
|
-
? orthogonal(rootOrientation)
|
|
101
|
-
: rootOrientation;
|
|
102
|
-
}
|
|
103
|
-
export const orthogonal = (orientation) => orientation === Orientation.HORIZONTAL
|
|
104
|
-
? Orientation.VERTICAL
|
|
105
|
-
: Orientation.HORIZONTAL;
|
|
106
|
-
export function isGridBranchNode(node) {
|
|
107
|
-
return !!node.children;
|
|
108
|
-
}
|
|
109
|
-
const serializeBranchNode = (node, orientation) => {
|
|
110
|
-
const size = orientation === Orientation.VERTICAL ? node.box.width : node.box.height;
|
|
111
|
-
if (!isGridBranchNode(node)) {
|
|
112
|
-
if (typeof node.cachedVisibleSize === 'number') {
|
|
113
|
-
return {
|
|
114
|
-
type: 'leaf',
|
|
115
|
-
data: node.view.toJSON(),
|
|
116
|
-
size: node.cachedVisibleSize,
|
|
117
|
-
visible: false,
|
|
118
|
-
};
|
|
119
|
-
}
|
|
120
|
-
return { type: 'leaf', data: node.view.toJSON(), size };
|
|
121
|
-
}
|
|
122
|
-
return {
|
|
123
|
-
type: 'branch',
|
|
124
|
-
data: node.children.map((c) => serializeBranchNode(c, orthogonal(orientation))),
|
|
125
|
-
size,
|
|
126
|
-
};
|
|
127
|
-
};
|
|
128
|
-
export class Gridview {
|
|
129
|
-
constructor(proportionalLayout, styles, orientation) {
|
|
130
|
-
this.proportionalLayout = proportionalLayout;
|
|
131
|
-
this.styles = styles;
|
|
132
|
-
this.disposable = new MutableDisposable();
|
|
133
|
-
this._onDidChange = new Emitter();
|
|
134
|
-
this.onDidChange = this._onDidChange.event;
|
|
135
|
-
this.element = document.createElement('div');
|
|
136
|
-
this.element.className = 'grid-view';
|
|
137
|
-
this.root = new BranchNode(orientation, proportionalLayout, styles, 0, 0);
|
|
138
|
-
}
|
|
139
|
-
serialize() {
|
|
140
|
-
const root = serializeBranchNode(this.getView(), this.orientation);
|
|
141
|
-
return {
|
|
142
|
-
root,
|
|
143
|
-
width: this.width,
|
|
144
|
-
height: this.height,
|
|
145
|
-
orientation: this.orientation,
|
|
146
|
-
};
|
|
147
|
-
}
|
|
148
|
-
dispose() {
|
|
149
|
-
this.disposable.dispose();
|
|
150
|
-
this._onDidChange.dispose();
|
|
151
|
-
this.root.dispose();
|
|
152
|
-
this.element.remove();
|
|
153
|
-
}
|
|
154
|
-
clear() {
|
|
155
|
-
const orientation = this.root.orientation;
|
|
156
|
-
this.root = new BranchNode(orientation, this.proportionalLayout, this.styles, this.root.size, this.root.orthogonalSize);
|
|
157
|
-
}
|
|
158
|
-
deserialize(json, deserializer) {
|
|
159
|
-
const orientation = json.orientation;
|
|
160
|
-
const height = orientation === Orientation.VERTICAL ? json.height : json.width;
|
|
161
|
-
this._deserialize(json.root, orientation, deserializer, height);
|
|
162
|
-
}
|
|
163
|
-
_deserialize(root, orientation, deserializer, orthogonalSize) {
|
|
164
|
-
this.root = this._deserializeNode(root, orientation, deserializer, orthogonalSize, true);
|
|
165
|
-
}
|
|
166
|
-
_deserializeNode(node, orientation, deserializer, orthogonalSize, isRoot = false) {
|
|
167
|
-
let result;
|
|
168
|
-
if (node.type === 'branch') {
|
|
169
|
-
const serializedChildren = node.data;
|
|
170
|
-
const children = serializedChildren.map((serializedChild) => {
|
|
171
|
-
return {
|
|
172
|
-
node: this._deserializeNode(serializedChild, orthogonal(orientation), deserializer, node.size),
|
|
173
|
-
visible: serializedChild.visible,
|
|
174
|
-
};
|
|
175
|
-
});
|
|
176
|
-
// HORIZONTAL => height=orthogonalsize width=size
|
|
177
|
-
// VERTICAL => height=size width=orthogonalsize
|
|
178
|
-
result = new BranchNode(orientation, this.proportionalLayout, this.styles, isRoot ? orthogonalSize : node.size, isRoot ? node.size : orthogonalSize, children);
|
|
179
|
-
}
|
|
180
|
-
else {
|
|
181
|
-
result = new LeafNode(deserializer.fromJSON(node), orientation, orthogonalSize, node.size);
|
|
182
|
-
}
|
|
183
|
-
return result;
|
|
184
|
-
}
|
|
185
|
-
get orientation() {
|
|
186
|
-
return this.root.orientation;
|
|
187
|
-
}
|
|
188
|
-
set orientation(orientation) {
|
|
189
|
-
if (this.root.orientation === orientation) {
|
|
190
|
-
return;
|
|
191
|
-
}
|
|
192
|
-
const { size, orthogonalSize } = this.root;
|
|
193
|
-
this.root = flipNode(this.root, orthogonalSize, size);
|
|
194
|
-
this.root.layout(size, orthogonalSize);
|
|
195
|
-
}
|
|
196
|
-
get root() {
|
|
197
|
-
return this._root;
|
|
198
|
-
}
|
|
199
|
-
set root(root) {
|
|
200
|
-
const oldRoot = this._root;
|
|
201
|
-
if (oldRoot) {
|
|
202
|
-
oldRoot.dispose();
|
|
203
|
-
this.element.removeChild(oldRoot.element);
|
|
204
|
-
}
|
|
205
|
-
this._root = root;
|
|
206
|
-
this.element.appendChild(this._root.element);
|
|
207
|
-
this.disposable.value = this._root.onDidChange((e) => {
|
|
208
|
-
this._onDidChange.fire(e);
|
|
209
|
-
});
|
|
210
|
-
}
|
|
211
|
-
next(location) {
|
|
212
|
-
return this.progmaticSelect(location);
|
|
213
|
-
}
|
|
214
|
-
previous(location) {
|
|
215
|
-
return this.progmaticSelect(location, true);
|
|
216
|
-
}
|
|
217
|
-
getView(location) {
|
|
218
|
-
const node = location ? this.getNode(location)[1] : this.root;
|
|
219
|
-
return this._getViews(node, this.orientation);
|
|
220
|
-
}
|
|
221
|
-
_getViews(node, orientation, cachedVisibleSize) {
|
|
222
|
-
const box = { height: node.height, width: node.width };
|
|
223
|
-
if (node instanceof LeafNode) {
|
|
224
|
-
return { box, view: node.view, cachedVisibleSize };
|
|
225
|
-
}
|
|
226
|
-
const children = [];
|
|
227
|
-
for (let i = 0; i < node.children.length; i++) {
|
|
228
|
-
const child = node.children[i];
|
|
229
|
-
const nodeCachedVisibleSize = node.getChildCachedVisibleSize(i);
|
|
230
|
-
children.push(this._getViews(child, orthogonal(orientation), nodeCachedVisibleSize));
|
|
231
|
-
}
|
|
232
|
-
return { box, children };
|
|
233
|
-
}
|
|
234
|
-
progmaticSelect(location, reverse = false) {
|
|
235
|
-
const [path, node] = this.getNode(location);
|
|
236
|
-
if (!(node instanceof LeafNode)) {
|
|
237
|
-
throw new Error('invalid location');
|
|
238
|
-
}
|
|
239
|
-
for (let i = path.length - 1; i > -1; i--) {
|
|
240
|
-
const n = path[i];
|
|
241
|
-
const l = location[i] || 0;
|
|
242
|
-
const canProgressInCurrentLevel = reverse
|
|
243
|
-
? l - 1 > -1
|
|
244
|
-
: l + 1 < n.children.length;
|
|
245
|
-
if (canProgressInCurrentLevel) {
|
|
246
|
-
return findLeaf(n.children[reverse ? l - 1 : l + 1], reverse);
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
return findLeaf(this.root, reverse);
|
|
250
|
-
}
|
|
251
|
-
get width() {
|
|
252
|
-
return this.root.width;
|
|
253
|
-
}
|
|
254
|
-
get height() {
|
|
255
|
-
return this.root.height;
|
|
256
|
-
}
|
|
257
|
-
get minimumWidth() {
|
|
258
|
-
return this.root.minimumWidth;
|
|
259
|
-
}
|
|
260
|
-
get minimumHeight() {
|
|
261
|
-
return this.root.minimumHeight;
|
|
262
|
-
}
|
|
263
|
-
get maximumWidth() {
|
|
264
|
-
return this.root.maximumHeight;
|
|
265
|
-
}
|
|
266
|
-
get maximumHeight() {
|
|
267
|
-
return this.root.maximumHeight;
|
|
268
|
-
}
|
|
269
|
-
isViewVisible(location) {
|
|
270
|
-
const [rest, index] = tail(location);
|
|
271
|
-
const [, parent] = this.getNode(rest);
|
|
272
|
-
if (!(parent instanceof BranchNode)) {
|
|
273
|
-
throw new Error('Invalid from location');
|
|
274
|
-
}
|
|
275
|
-
return parent.isChildVisible(index);
|
|
276
|
-
}
|
|
277
|
-
setViewVisible(location, visible) {
|
|
278
|
-
const [rest, index] = tail(location);
|
|
279
|
-
const [, parent] = this.getNode(rest);
|
|
280
|
-
if (!(parent instanceof BranchNode)) {
|
|
281
|
-
throw new Error('Invalid from location');
|
|
282
|
-
}
|
|
283
|
-
parent.setChildVisible(index, visible);
|
|
284
|
-
}
|
|
285
|
-
moveView(parentLocation, from, to) {
|
|
286
|
-
const [, parent] = this.getNode(parentLocation);
|
|
287
|
-
if (!(parent instanceof BranchNode)) {
|
|
288
|
-
throw new Error('Invalid location');
|
|
289
|
-
}
|
|
290
|
-
parent.moveChild(from, to);
|
|
291
|
-
}
|
|
292
|
-
addView(view, size, location) {
|
|
293
|
-
const [rest, index] = tail(location);
|
|
294
|
-
const [pathToParent, parent] = this.getNode(rest);
|
|
295
|
-
if (parent instanceof BranchNode) {
|
|
296
|
-
const node = new LeafNode(view, orthogonal(parent.orientation), parent.orthogonalSize);
|
|
297
|
-
parent.addChild(node, size, index);
|
|
298
|
-
}
|
|
299
|
-
else {
|
|
300
|
-
const [grandParent, ..._] = [...pathToParent].reverse();
|
|
301
|
-
const [parentIndex, ...__] = [...rest].reverse();
|
|
302
|
-
let newSiblingSize = 0;
|
|
303
|
-
const newSiblingCachedVisibleSize = grandParent.getChildCachedVisibleSize(parentIndex);
|
|
304
|
-
if (typeof newSiblingCachedVisibleSize === 'number') {
|
|
305
|
-
newSiblingSize = Sizing.Invisible(newSiblingCachedVisibleSize);
|
|
306
|
-
}
|
|
307
|
-
grandParent.removeChild(parentIndex);
|
|
308
|
-
const newParent = new BranchNode(parent.orientation, this.proportionalLayout, this.styles, parent.size, parent.orthogonalSize);
|
|
309
|
-
grandParent.addChild(newParent, parent.size, parentIndex);
|
|
310
|
-
const newSibling = new LeafNode(parent.view, grandParent.orientation, parent.size);
|
|
311
|
-
newParent.addChild(newSibling, newSiblingSize, 0);
|
|
312
|
-
if (typeof size !== 'number' && size.type === 'split') {
|
|
313
|
-
size = { type: 'split', index: 0 };
|
|
314
|
-
}
|
|
315
|
-
const node = new LeafNode(view, grandParent.orientation, parent.size);
|
|
316
|
-
newParent.addChild(node, size, index);
|
|
317
|
-
}
|
|
318
|
-
}
|
|
319
|
-
remove(view, sizing) {
|
|
320
|
-
const location = getGridLocation(view.element);
|
|
321
|
-
return this.removeView(location, sizing);
|
|
322
|
-
}
|
|
323
|
-
removeView(location, sizing) {
|
|
324
|
-
const [rest, index] = tail(location);
|
|
325
|
-
const [pathToParent, parent] = this.getNode(rest);
|
|
326
|
-
if (!(parent instanceof BranchNode)) {
|
|
327
|
-
throw new Error('Invalid location');
|
|
328
|
-
}
|
|
329
|
-
const node = parent.children[index];
|
|
330
|
-
if (!(node instanceof LeafNode)) {
|
|
331
|
-
throw new Error('Invalid location');
|
|
332
|
-
}
|
|
333
|
-
parent.removeChild(index, sizing);
|
|
334
|
-
if (parent.children.length === 0) {
|
|
335
|
-
return node.view;
|
|
336
|
-
}
|
|
337
|
-
if (parent.children.length > 1) {
|
|
338
|
-
return node.view;
|
|
339
|
-
}
|
|
340
|
-
const sibling = parent.children[0];
|
|
341
|
-
if (pathToParent.length === 0) {
|
|
342
|
-
// parent is root
|
|
343
|
-
if (sibling instanceof LeafNode) {
|
|
344
|
-
return node.view;
|
|
345
|
-
}
|
|
346
|
-
// we must promote sibling to be the new root
|
|
347
|
-
parent.removeChild(0, sizing);
|
|
348
|
-
this.root = sibling;
|
|
349
|
-
return node.view;
|
|
350
|
-
}
|
|
351
|
-
const [grandParent, ..._] = [...pathToParent].reverse();
|
|
352
|
-
const [parentIndex, ...__] = [...rest].reverse();
|
|
353
|
-
const isSiblingVisible = parent.isChildVisible(0);
|
|
354
|
-
parent.removeChild(0, sizing);
|
|
355
|
-
const sizes = grandParent.children.map((_size, i) => grandParent.getChildSize(i));
|
|
356
|
-
grandParent.removeChild(parentIndex, sizing);
|
|
357
|
-
if (sibling instanceof BranchNode) {
|
|
358
|
-
sizes.splice(parentIndex, 1, ...sibling.children.map((c) => c.size));
|
|
359
|
-
for (let i = 0; i < sibling.children.length; i++) {
|
|
360
|
-
const child = sibling.children[i];
|
|
361
|
-
grandParent.addChild(child, child.size, parentIndex + i);
|
|
362
|
-
}
|
|
363
|
-
}
|
|
364
|
-
else {
|
|
365
|
-
const newSibling = new LeafNode(sibling.view, orthogonal(sibling.orientation), sibling.size);
|
|
366
|
-
const siblingSizing = isSiblingVisible
|
|
367
|
-
? sibling.orthogonalSize
|
|
368
|
-
: Sizing.Invisible(sibling.orthogonalSize);
|
|
369
|
-
grandParent.addChild(newSibling, siblingSizing, parentIndex);
|
|
370
|
-
}
|
|
371
|
-
for (let i = 0; i < sizes.length; i++) {
|
|
372
|
-
grandParent.resizeChild(i, sizes[i]);
|
|
373
|
-
}
|
|
374
|
-
return node.view;
|
|
375
|
-
}
|
|
376
|
-
layout(width, height) {
|
|
377
|
-
const [size, orthogonalSize] = this.root.orientation === Orientation.HORIZONTAL
|
|
378
|
-
? [height, width]
|
|
379
|
-
: [width, height];
|
|
380
|
-
this.root.layout(size, orthogonalSize);
|
|
381
|
-
}
|
|
382
|
-
getNode(location, node = this.root, path = []) {
|
|
383
|
-
if (location.length === 0) {
|
|
384
|
-
return [path, node];
|
|
385
|
-
}
|
|
386
|
-
if (!(node instanceof BranchNode)) {
|
|
387
|
-
throw new Error('Invalid location');
|
|
388
|
-
}
|
|
389
|
-
const [index, ...rest] = location;
|
|
390
|
-
if (index < 0 || index >= node.children.length) {
|
|
391
|
-
throw new Error('Invalid location');
|
|
392
|
-
}
|
|
393
|
-
const child = node.children[index];
|
|
394
|
-
path.push(node);
|
|
395
|
-
return this.getNode(rest, child, path);
|
|
396
|
-
}
|
|
397
|
-
}
|
|
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/grid
|
|
4
|
+
*--------------------------------------------------------------------------------------------*/
|
|
5
|
+
import { Orientation, Sizing, } from '../splitview/core/splitview';
|
|
6
|
+
import { Position } from '../dnd/droptarget';
|
|
7
|
+
import { tail } from '../array';
|
|
8
|
+
import { LeafNode } from './leafNode';
|
|
9
|
+
import { BranchNode } from './branchNode';
|
|
10
|
+
import { Emitter } from '../events';
|
|
11
|
+
import { MutableDisposable } from '../lifecycle';
|
|
12
|
+
function findLeaf(candiateNode, last) {
|
|
13
|
+
if (candiateNode instanceof LeafNode) {
|
|
14
|
+
return candiateNode;
|
|
15
|
+
}
|
|
16
|
+
if (candiateNode instanceof BranchNode) {
|
|
17
|
+
return findLeaf(candiateNode.children[last ? candiateNode.children.length - 1 : 0], last);
|
|
18
|
+
}
|
|
19
|
+
throw new Error('invalid node');
|
|
20
|
+
}
|
|
21
|
+
function flipNode(node, size, orthogonalSize) {
|
|
22
|
+
if (node instanceof BranchNode) {
|
|
23
|
+
const result = new BranchNode(orthogonal(node.orientation), node.proportionalLayout, node.styles, size, orthogonalSize);
|
|
24
|
+
let totalSize = 0;
|
|
25
|
+
for (let i = node.children.length - 1; i >= 0; i--) {
|
|
26
|
+
const child = node.children[i];
|
|
27
|
+
const childSize = child instanceof BranchNode ? child.orthogonalSize : child.size;
|
|
28
|
+
let newSize = node.size === 0
|
|
29
|
+
? 0
|
|
30
|
+
: Math.round((size * childSize) / node.size);
|
|
31
|
+
totalSize += newSize;
|
|
32
|
+
// The last view to add should adjust to rounding errors
|
|
33
|
+
if (i === 0) {
|
|
34
|
+
newSize += size - totalSize;
|
|
35
|
+
}
|
|
36
|
+
result.addChild(flipNode(child, orthogonalSize, newSize), newSize, 0, true);
|
|
37
|
+
}
|
|
38
|
+
return result;
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
return new LeafNode(node.view, orthogonal(node.orientation), orthogonalSize);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
export function indexInParent(element) {
|
|
45
|
+
const parentElement = element.parentElement;
|
|
46
|
+
if (!parentElement) {
|
|
47
|
+
throw new Error('Invalid grid element');
|
|
48
|
+
}
|
|
49
|
+
let el = parentElement.firstElementChild;
|
|
50
|
+
let index = 0;
|
|
51
|
+
while (el !== element && el !== parentElement.lastElementChild && el) {
|
|
52
|
+
el = el.nextElementSibling;
|
|
53
|
+
index++;
|
|
54
|
+
}
|
|
55
|
+
return index;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Find the grid location of a specific DOM element by traversing the parent
|
|
59
|
+
* chain and finding each child index on the way.
|
|
60
|
+
*
|
|
61
|
+
* This will break as soon as DOM structures of the Splitview or Gridview change.
|
|
62
|
+
*/
|
|
63
|
+
export function getGridLocation(element) {
|
|
64
|
+
const parentElement = element.parentElement;
|
|
65
|
+
if (!parentElement) {
|
|
66
|
+
throw new Error('Invalid grid element');
|
|
67
|
+
}
|
|
68
|
+
if (/\bgrid-view\b/.test(parentElement.className)) {
|
|
69
|
+
return [];
|
|
70
|
+
}
|
|
71
|
+
const index = indexInParent(parentElement);
|
|
72
|
+
const ancestor = parentElement.parentElement.parentElement.parentElement;
|
|
73
|
+
return [...getGridLocation(ancestor), index];
|
|
74
|
+
}
|
|
75
|
+
export function getRelativeLocation(rootOrientation, location, direction) {
|
|
76
|
+
const orientation = getLocationOrientation(rootOrientation, location);
|
|
77
|
+
const directionOrientation = getDirectionOrientation(direction);
|
|
78
|
+
if (orientation === directionOrientation) {
|
|
79
|
+
const [rest, _index] = tail(location);
|
|
80
|
+
let index = _index;
|
|
81
|
+
if (direction === Position.Right || direction === Position.Bottom) {
|
|
82
|
+
index += 1;
|
|
83
|
+
}
|
|
84
|
+
return [...rest, index];
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
const index = direction === Position.Right || direction === Position.Bottom
|
|
88
|
+
? 1
|
|
89
|
+
: 0;
|
|
90
|
+
return [...location, index];
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
export function getDirectionOrientation(direction) {
|
|
94
|
+
return direction === Position.Top || direction === Position.Bottom
|
|
95
|
+
? Orientation.VERTICAL
|
|
96
|
+
: Orientation.HORIZONTAL;
|
|
97
|
+
}
|
|
98
|
+
export function getLocationOrientation(rootOrientation, location) {
|
|
99
|
+
return location.length % 2 === 0
|
|
100
|
+
? orthogonal(rootOrientation)
|
|
101
|
+
: rootOrientation;
|
|
102
|
+
}
|
|
103
|
+
export const orthogonal = (orientation) => orientation === Orientation.HORIZONTAL
|
|
104
|
+
? Orientation.VERTICAL
|
|
105
|
+
: Orientation.HORIZONTAL;
|
|
106
|
+
export function isGridBranchNode(node) {
|
|
107
|
+
return !!node.children;
|
|
108
|
+
}
|
|
109
|
+
const serializeBranchNode = (node, orientation) => {
|
|
110
|
+
const size = orientation === Orientation.VERTICAL ? node.box.width : node.box.height;
|
|
111
|
+
if (!isGridBranchNode(node)) {
|
|
112
|
+
if (typeof node.cachedVisibleSize === 'number') {
|
|
113
|
+
return {
|
|
114
|
+
type: 'leaf',
|
|
115
|
+
data: node.view.toJSON(),
|
|
116
|
+
size: node.cachedVisibleSize,
|
|
117
|
+
visible: false,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
return { type: 'leaf', data: node.view.toJSON(), size };
|
|
121
|
+
}
|
|
122
|
+
return {
|
|
123
|
+
type: 'branch',
|
|
124
|
+
data: node.children.map((c) => serializeBranchNode(c, orthogonal(orientation))),
|
|
125
|
+
size,
|
|
126
|
+
};
|
|
127
|
+
};
|
|
128
|
+
export class Gridview {
|
|
129
|
+
constructor(proportionalLayout, styles, orientation) {
|
|
130
|
+
this.proportionalLayout = proportionalLayout;
|
|
131
|
+
this.styles = styles;
|
|
132
|
+
this.disposable = new MutableDisposable();
|
|
133
|
+
this._onDidChange = new Emitter();
|
|
134
|
+
this.onDidChange = this._onDidChange.event;
|
|
135
|
+
this.element = document.createElement('div');
|
|
136
|
+
this.element.className = 'grid-view';
|
|
137
|
+
this.root = new BranchNode(orientation, proportionalLayout, styles, 0, 0);
|
|
138
|
+
}
|
|
139
|
+
serialize() {
|
|
140
|
+
const root = serializeBranchNode(this.getView(), this.orientation);
|
|
141
|
+
return {
|
|
142
|
+
root,
|
|
143
|
+
width: this.width,
|
|
144
|
+
height: this.height,
|
|
145
|
+
orientation: this.orientation,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
dispose() {
|
|
149
|
+
this.disposable.dispose();
|
|
150
|
+
this._onDidChange.dispose();
|
|
151
|
+
this.root.dispose();
|
|
152
|
+
this.element.remove();
|
|
153
|
+
}
|
|
154
|
+
clear() {
|
|
155
|
+
const orientation = this.root.orientation;
|
|
156
|
+
this.root = new BranchNode(orientation, this.proportionalLayout, this.styles, this.root.size, this.root.orthogonalSize);
|
|
157
|
+
}
|
|
158
|
+
deserialize(json, deserializer) {
|
|
159
|
+
const orientation = json.orientation;
|
|
160
|
+
const height = orientation === Orientation.VERTICAL ? json.height : json.width;
|
|
161
|
+
this._deserialize(json.root, orientation, deserializer, height);
|
|
162
|
+
}
|
|
163
|
+
_deserialize(root, orientation, deserializer, orthogonalSize) {
|
|
164
|
+
this.root = this._deserializeNode(root, orientation, deserializer, orthogonalSize, true);
|
|
165
|
+
}
|
|
166
|
+
_deserializeNode(node, orientation, deserializer, orthogonalSize, isRoot = false) {
|
|
167
|
+
let result;
|
|
168
|
+
if (node.type === 'branch') {
|
|
169
|
+
const serializedChildren = node.data;
|
|
170
|
+
const children = serializedChildren.map((serializedChild) => {
|
|
171
|
+
return {
|
|
172
|
+
node: this._deserializeNode(serializedChild, orthogonal(orientation), deserializer, node.size),
|
|
173
|
+
visible: serializedChild.visible,
|
|
174
|
+
};
|
|
175
|
+
});
|
|
176
|
+
// HORIZONTAL => height=orthogonalsize width=size
|
|
177
|
+
// VERTICAL => height=size width=orthogonalsize
|
|
178
|
+
result = new BranchNode(orientation, this.proportionalLayout, this.styles, isRoot ? orthogonalSize : node.size, isRoot ? node.size : orthogonalSize, children);
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
result = new LeafNode(deserializer.fromJSON(node), orientation, orthogonalSize, node.size);
|
|
182
|
+
}
|
|
183
|
+
return result;
|
|
184
|
+
}
|
|
185
|
+
get orientation() {
|
|
186
|
+
return this.root.orientation;
|
|
187
|
+
}
|
|
188
|
+
set orientation(orientation) {
|
|
189
|
+
if (this.root.orientation === orientation) {
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
const { size, orthogonalSize } = this.root;
|
|
193
|
+
this.root = flipNode(this.root, orthogonalSize, size);
|
|
194
|
+
this.root.layout(size, orthogonalSize);
|
|
195
|
+
}
|
|
196
|
+
get root() {
|
|
197
|
+
return this._root;
|
|
198
|
+
}
|
|
199
|
+
set root(root) {
|
|
200
|
+
const oldRoot = this._root;
|
|
201
|
+
if (oldRoot) {
|
|
202
|
+
oldRoot.dispose();
|
|
203
|
+
this.element.removeChild(oldRoot.element);
|
|
204
|
+
}
|
|
205
|
+
this._root = root;
|
|
206
|
+
this.element.appendChild(this._root.element);
|
|
207
|
+
this.disposable.value = this._root.onDidChange((e) => {
|
|
208
|
+
this._onDidChange.fire(e);
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
next(location) {
|
|
212
|
+
return this.progmaticSelect(location);
|
|
213
|
+
}
|
|
214
|
+
previous(location) {
|
|
215
|
+
return this.progmaticSelect(location, true);
|
|
216
|
+
}
|
|
217
|
+
getView(location) {
|
|
218
|
+
const node = location ? this.getNode(location)[1] : this.root;
|
|
219
|
+
return this._getViews(node, this.orientation);
|
|
220
|
+
}
|
|
221
|
+
_getViews(node, orientation, cachedVisibleSize) {
|
|
222
|
+
const box = { height: node.height, width: node.width };
|
|
223
|
+
if (node instanceof LeafNode) {
|
|
224
|
+
return { box, view: node.view, cachedVisibleSize };
|
|
225
|
+
}
|
|
226
|
+
const children = [];
|
|
227
|
+
for (let i = 0; i < node.children.length; i++) {
|
|
228
|
+
const child = node.children[i];
|
|
229
|
+
const nodeCachedVisibleSize = node.getChildCachedVisibleSize(i);
|
|
230
|
+
children.push(this._getViews(child, orthogonal(orientation), nodeCachedVisibleSize));
|
|
231
|
+
}
|
|
232
|
+
return { box, children };
|
|
233
|
+
}
|
|
234
|
+
progmaticSelect(location, reverse = false) {
|
|
235
|
+
const [path, node] = this.getNode(location);
|
|
236
|
+
if (!(node instanceof LeafNode)) {
|
|
237
|
+
throw new Error('invalid location');
|
|
238
|
+
}
|
|
239
|
+
for (let i = path.length - 1; i > -1; i--) {
|
|
240
|
+
const n = path[i];
|
|
241
|
+
const l = location[i] || 0;
|
|
242
|
+
const canProgressInCurrentLevel = reverse
|
|
243
|
+
? l - 1 > -1
|
|
244
|
+
: l + 1 < n.children.length;
|
|
245
|
+
if (canProgressInCurrentLevel) {
|
|
246
|
+
return findLeaf(n.children[reverse ? l - 1 : l + 1], reverse);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
return findLeaf(this.root, reverse);
|
|
250
|
+
}
|
|
251
|
+
get width() {
|
|
252
|
+
return this.root.width;
|
|
253
|
+
}
|
|
254
|
+
get height() {
|
|
255
|
+
return this.root.height;
|
|
256
|
+
}
|
|
257
|
+
get minimumWidth() {
|
|
258
|
+
return this.root.minimumWidth;
|
|
259
|
+
}
|
|
260
|
+
get minimumHeight() {
|
|
261
|
+
return this.root.minimumHeight;
|
|
262
|
+
}
|
|
263
|
+
get maximumWidth() {
|
|
264
|
+
return this.root.maximumHeight;
|
|
265
|
+
}
|
|
266
|
+
get maximumHeight() {
|
|
267
|
+
return this.root.maximumHeight;
|
|
268
|
+
}
|
|
269
|
+
isViewVisible(location) {
|
|
270
|
+
const [rest, index] = tail(location);
|
|
271
|
+
const [, parent] = this.getNode(rest);
|
|
272
|
+
if (!(parent instanceof BranchNode)) {
|
|
273
|
+
throw new Error('Invalid from location');
|
|
274
|
+
}
|
|
275
|
+
return parent.isChildVisible(index);
|
|
276
|
+
}
|
|
277
|
+
setViewVisible(location, visible) {
|
|
278
|
+
const [rest, index] = tail(location);
|
|
279
|
+
const [, parent] = this.getNode(rest);
|
|
280
|
+
if (!(parent instanceof BranchNode)) {
|
|
281
|
+
throw new Error('Invalid from location');
|
|
282
|
+
}
|
|
283
|
+
parent.setChildVisible(index, visible);
|
|
284
|
+
}
|
|
285
|
+
moveView(parentLocation, from, to) {
|
|
286
|
+
const [, parent] = this.getNode(parentLocation);
|
|
287
|
+
if (!(parent instanceof BranchNode)) {
|
|
288
|
+
throw new Error('Invalid location');
|
|
289
|
+
}
|
|
290
|
+
parent.moveChild(from, to);
|
|
291
|
+
}
|
|
292
|
+
addView(view, size, location) {
|
|
293
|
+
const [rest, index] = tail(location);
|
|
294
|
+
const [pathToParent, parent] = this.getNode(rest);
|
|
295
|
+
if (parent instanceof BranchNode) {
|
|
296
|
+
const node = new LeafNode(view, orthogonal(parent.orientation), parent.orthogonalSize);
|
|
297
|
+
parent.addChild(node, size, index);
|
|
298
|
+
}
|
|
299
|
+
else {
|
|
300
|
+
const [grandParent, ..._] = [...pathToParent].reverse();
|
|
301
|
+
const [parentIndex, ...__] = [...rest].reverse();
|
|
302
|
+
let newSiblingSize = 0;
|
|
303
|
+
const newSiblingCachedVisibleSize = grandParent.getChildCachedVisibleSize(parentIndex);
|
|
304
|
+
if (typeof newSiblingCachedVisibleSize === 'number') {
|
|
305
|
+
newSiblingSize = Sizing.Invisible(newSiblingCachedVisibleSize);
|
|
306
|
+
}
|
|
307
|
+
grandParent.removeChild(parentIndex);
|
|
308
|
+
const newParent = new BranchNode(parent.orientation, this.proportionalLayout, this.styles, parent.size, parent.orthogonalSize);
|
|
309
|
+
grandParent.addChild(newParent, parent.size, parentIndex);
|
|
310
|
+
const newSibling = new LeafNode(parent.view, grandParent.orientation, parent.size);
|
|
311
|
+
newParent.addChild(newSibling, newSiblingSize, 0);
|
|
312
|
+
if (typeof size !== 'number' && size.type === 'split') {
|
|
313
|
+
size = { type: 'split', index: 0 };
|
|
314
|
+
}
|
|
315
|
+
const node = new LeafNode(view, grandParent.orientation, parent.size);
|
|
316
|
+
newParent.addChild(node, size, index);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
remove(view, sizing) {
|
|
320
|
+
const location = getGridLocation(view.element);
|
|
321
|
+
return this.removeView(location, sizing);
|
|
322
|
+
}
|
|
323
|
+
removeView(location, sizing) {
|
|
324
|
+
const [rest, index] = tail(location);
|
|
325
|
+
const [pathToParent, parent] = this.getNode(rest);
|
|
326
|
+
if (!(parent instanceof BranchNode)) {
|
|
327
|
+
throw new Error('Invalid location');
|
|
328
|
+
}
|
|
329
|
+
const node = parent.children[index];
|
|
330
|
+
if (!(node instanceof LeafNode)) {
|
|
331
|
+
throw new Error('Invalid location');
|
|
332
|
+
}
|
|
333
|
+
parent.removeChild(index, sizing);
|
|
334
|
+
if (parent.children.length === 0) {
|
|
335
|
+
return node.view;
|
|
336
|
+
}
|
|
337
|
+
if (parent.children.length > 1) {
|
|
338
|
+
return node.view;
|
|
339
|
+
}
|
|
340
|
+
const sibling = parent.children[0];
|
|
341
|
+
if (pathToParent.length === 0) {
|
|
342
|
+
// parent is root
|
|
343
|
+
if (sibling instanceof LeafNode) {
|
|
344
|
+
return node.view;
|
|
345
|
+
}
|
|
346
|
+
// we must promote sibling to be the new root
|
|
347
|
+
parent.removeChild(0, sizing);
|
|
348
|
+
this.root = sibling;
|
|
349
|
+
return node.view;
|
|
350
|
+
}
|
|
351
|
+
const [grandParent, ..._] = [...pathToParent].reverse();
|
|
352
|
+
const [parentIndex, ...__] = [...rest].reverse();
|
|
353
|
+
const isSiblingVisible = parent.isChildVisible(0);
|
|
354
|
+
parent.removeChild(0, sizing);
|
|
355
|
+
const sizes = grandParent.children.map((_size, i) => grandParent.getChildSize(i));
|
|
356
|
+
grandParent.removeChild(parentIndex, sizing);
|
|
357
|
+
if (sibling instanceof BranchNode) {
|
|
358
|
+
sizes.splice(parentIndex, 1, ...sibling.children.map((c) => c.size));
|
|
359
|
+
for (let i = 0; i < sibling.children.length; i++) {
|
|
360
|
+
const child = sibling.children[i];
|
|
361
|
+
grandParent.addChild(child, child.size, parentIndex + i);
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
else {
|
|
365
|
+
const newSibling = new LeafNode(sibling.view, orthogonal(sibling.orientation), sibling.size);
|
|
366
|
+
const siblingSizing = isSiblingVisible
|
|
367
|
+
? sibling.orthogonalSize
|
|
368
|
+
: Sizing.Invisible(sibling.orthogonalSize);
|
|
369
|
+
grandParent.addChild(newSibling, siblingSizing, parentIndex);
|
|
370
|
+
}
|
|
371
|
+
for (let i = 0; i < sizes.length; i++) {
|
|
372
|
+
grandParent.resizeChild(i, sizes[i]);
|
|
373
|
+
}
|
|
374
|
+
return node.view;
|
|
375
|
+
}
|
|
376
|
+
layout(width, height) {
|
|
377
|
+
const [size, orthogonalSize] = this.root.orientation === Orientation.HORIZONTAL
|
|
378
|
+
? [height, width]
|
|
379
|
+
: [width, height];
|
|
380
|
+
this.root.layout(size, orthogonalSize);
|
|
381
|
+
}
|
|
382
|
+
getNode(location, node = this.root, path = []) {
|
|
383
|
+
if (location.length === 0) {
|
|
384
|
+
return [path, node];
|
|
385
|
+
}
|
|
386
|
+
if (!(node instanceof BranchNode)) {
|
|
387
|
+
throw new Error('Invalid location');
|
|
388
|
+
}
|
|
389
|
+
const [index, ...rest] = location;
|
|
390
|
+
if (index < 0 || index >= node.children.length) {
|
|
391
|
+
throw new Error('Invalid location');
|
|
392
|
+
}
|
|
393
|
+
const child = node.children[index];
|
|
394
|
+
path.push(node);
|
|
395
|
+
return this.getNode(rest, child, path);
|
|
396
|
+
}
|
|
397
|
+
}
|