@datagrok-libraries/dock-spawn-dg 0.0.2 → 0.0.3
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/README.md +0 -3
- package/index.d.ts +33 -0
- package/index.d.ts.map +1 -0
- package/index.js +32 -0
- package/package.json +10 -17
- package/src/BrowserDialogHelper.d.ts.map +1 -0
- package/{lib → src}/BrowserDialogHelper.js +18 -12
- package/src/BrowserDialogHelper.ts +48 -47
- package/src/ContainerType.d.ts.map +1 -0
- package/src/ContainerType.ts +1 -1
- package/{lib → src}/Dialog.d.ts +7 -7
- package/src/Dialog.d.ts.map +1 -0
- package/{lib → src}/Dialog.js +46 -58
- package/src/Dialog.ts +253 -250
- package/src/DockConfig.d.ts.map +1 -0
- package/{lib → src}/DockConfig.js +0 -5
- package/src/DockConfig.ts +1 -1
- package/{lib → src}/DockGraphDeserializer.d.ts +6 -6
- package/src/DockGraphDeserializer.d.ts.map +1 -0
- package/src/DockGraphDeserializer.js +133 -0
- package/src/DockGraphDeserializer.ts +113 -108
- package/src/DockGraphSerializer.d.ts +14 -0
- package/src/DockGraphSerializer.d.ts.map +1 -0
- package/{lib → src}/DockGraphSerializer.js +11 -11
- package/src/DockGraphSerializer.ts +48 -47
- package/{lib → src}/DockLayoutEngine.d.ts +12 -12
- package/src/DockLayoutEngine.d.ts.map +1 -0
- package/{lib → src}/DockLayoutEngine.js +49 -53
- package/src/DockLayoutEngine.ts +351 -346
- package/{lib → src}/DockManager.d.ts +34 -34
- package/src/DockManager.d.ts.map +1 -0
- package/{lib → src}/DockManager.js +168 -151
- package/src/DockManager.ts +860 -834
- package/{lib → src}/DockManagerContext.d.ts +3 -3
- package/src/DockManagerContext.d.ts.map +1 -0
- package/{lib → src}/DockManagerContext.js +2 -5
- package/src/DockManagerContext.ts +5 -5
- package/{lib → src}/DockModel.d.ts +2 -2
- package/src/DockModel.d.ts.map +1 -0
- package/{lib → src}/DockModel.js +0 -3
- package/src/DockModel.ts +2 -2
- package/{lib → src}/DockNode.d.ts +1 -1
- package/src/DockNode.d.ts.map +1 -0
- package/{lib → src}/DockNode.js +0 -3
- package/src/DockNode.ts +2 -2
- package/{lib → src}/DockWheel.d.ts +5 -5
- package/src/DockWheel.d.ts.map +1 -0
- package/{lib → src}/DockWheel.js +3 -11
- package/src/DockWheel.ts +6 -6
- package/{lib → src}/DockWheelItem.d.ts +3 -3
- package/src/DockWheelItem.d.ts.map +1 -0
- package/{lib → src}/DockWheelItem.js +1 -8
- package/src/DockWheelItem.ts +4 -4
- package/{lib → src}/DocumentManagerContainer.d.ts +4 -4
- package/src/DocumentManagerContainer.d.ts.map +1 -0
- package/{lib → src}/DocumentManagerContainer.js +3 -3
- package/src/DocumentManagerContainer.ts +9 -9
- package/{lib → src}/DocumentTabPage.d.ts +3 -3
- package/src/DocumentTabPage.d.ts.map +1 -0
- package/{lib → src}/DocumentTabPage.js +2 -2
- package/src/DocumentTabPage.ts +6 -6
- package/{lib → src}/DraggableContainer.d.ts +7 -7
- package/src/DraggableContainer.d.ts.map +1 -0
- package/{lib → src}/DraggableContainer.js +3 -16
- package/src/DraggableContainer.ts +10 -10
- package/src/EventHandler.d.ts.map +1 -0
- package/{lib → src}/EventHandler.js +0 -3
- package/src/EventHandler.ts +1 -1
- package/{lib → src}/FillDockContainer.d.ts +8 -8
- package/src/FillDockContainer.d.ts.map +1 -0
- package/{lib → src}/FillDockContainer.js +4 -14
- package/src/FillDockContainer.ts +10 -10
- package/src/HorizontalDockContainer.d.ts +7 -0
- package/src/HorizontalDockContainer.d.ts.map +1 -0
- package/{lib → src}/HorizontalDockContainer.js +3 -3
- package/src/HorizontalDockContainer.ts +6 -6
- package/{lib → src}/PanelContainer.d.ts +21 -20
- package/src/PanelContainer.d.ts.map +1 -0
- package/{lib → src}/PanelContainer.js +144 -148
- package/src/PanelContainer.ts +590 -577
- package/src/Point.d.ts.map +1 -0
- package/{lib → src}/Point.js +0 -2
- package/{lib → src}/ResizableContainer.d.ts +8 -8
- package/src/ResizableContainer.d.ts.map +1 -0
- package/{lib → src}/ResizableContainer.js +4 -17
- package/src/ResizableContainer.ts +11 -11
- package/{lib → src}/ResizeHandle.d.ts +1 -1
- package/src/ResizeHandle.d.ts.map +1 -0
- package/{lib → src}/ResizeHandle.js +0 -10
- package/src/ResizeHandle.ts +2 -2
- package/{lib → src}/SplitterBar.d.ts +3 -3
- package/src/SplitterBar.d.ts.map +1 -0
- package/{lib → src}/SplitterBar.js +2 -14
- package/src/SplitterBar.ts +5 -5
- package/{lib → src}/SplitterDockContainer.d.ts +7 -7
- package/src/SplitterDockContainer.d.ts.map +1 -0
- package/{lib → src}/SplitterDockContainer.js +1 -11
- package/src/SplitterDockContainer.ts +8 -8
- package/{lib → src}/SplitterPanel.d.ts +2 -2
- package/src/SplitterPanel.d.ts.map +1 -0
- package/{lib → src}/SplitterPanel.js +2 -6
- package/src/SplitterPanel.ts +4 -4
- package/{lib → src}/TabHandle.d.ts +5 -5
- package/src/TabHandle.d.ts.map +1 -0
- package/{lib → src}/TabHandle.js +81 -95
- package/src/TabHandle.ts +314 -311
- package/{lib → src}/TabHost.d.ts +6 -6
- package/src/TabHost.d.ts.map +1 -0
- package/{lib → src}/TabHost.js +4 -19
- package/src/TabHost.ts +9 -9
- package/{lib → src}/TabPage.d.ts +4 -4
- package/src/TabPage.d.ts.map +1 -0
- package/{lib → src}/TabPage.js +3 -10
- package/src/TabPage.ts +6 -6
- package/{lib → src}/UndockInitiator.d.ts +4 -4
- package/src/UndockInitiator.d.ts.map +1 -0
- package/{lib → src}/UndockInitiator.js +2 -14
- package/src/UndockInitiator.ts +7 -7
- package/src/Utils.d.ts.map +1 -0
- package/{lib → src}/Utils.js +1 -1
- package/src/Utils.ts +1 -1
- package/src/VerticalDockContainer.d.ts +7 -0
- package/src/VerticalDockContainer.d.ts.map +1 -0
- package/{lib → src}/VerticalDockContainer.js +3 -3
- package/src/VerticalDockContainer.ts +7 -7
- package/src/enums/PanelType.d.ts.map +1 -0
- package/src/enums/PanelType.ts +1 -1
- package/src/enums/TabHostDirection.d.ts.map +1 -0
- package/src/enums/TabHostDirection.ts +1 -1
- package/src/enums/WheelTypes.d.ts.map +1 -0
- package/src/enums/WheelTypes.ts +1 -1
- package/src/i18n/Defaults.d.ts.map +1 -0
- package/src/i18n/Defaults.ts +2 -2
- package/{lib → src}/i18n/Localizer.d.ts +1 -1
- package/src/i18n/Localizer.d.ts.map +1 -0
- package/{lib → src}/i18n/Localizer.js +3 -3
- package/src/i18n/Localizer.ts +2 -2
- package/src/index.d.ts.map +1 -0
- package/{lib → src}/interfaces/IDockContainer.d.ts +4 -4
- package/src/interfaces/IDockContainer.d.ts.map +1 -0
- package/src/interfaces/IDockContainer.ts +7 -7
- package/src/interfaces/IDockContainerWithSize.d.ts +6 -0
- package/src/interfaces/IDockContainerWithSize.d.ts.map +1 -0
- package/src/interfaces/IDockContainerWithSize.ts +3 -3
- package/{lib → src}/interfaces/ILayoutEventListener.d.ts +6 -6
- package/src/interfaces/ILayoutEventListener.d.ts.map +1 -0
- package/src/interfaces/ILayoutEventListener.ts +7 -7
- package/src/interfaces/IMouseOrTouchEvent.d.ts.map +1 -0
- package/src/interfaces/IMouseOrTouchEvent.ts +1 -1
- package/src/interfaces/INodeInfo.d.ts +8 -0
- package/src/interfaces/INodeInfo.d.ts.map +1 -0
- package/src/interfaces/INodeInfo.ts +2 -2
- package/src/interfaces/IPanelInfo.d.ts +10 -0
- package/src/interfaces/IPanelInfo.d.ts.map +1 -0
- package/src/interfaces/IPanelInfo.ts +3 -3
- package/src/interfaces/IRectangle.d.ts.map +1 -0
- package/src/interfaces/IRectangle.ts +1 -1
- package/src/interfaces/ISize.d.ts.map +1 -0
- package/{lib → src}/interfaces/IState.d.ts +1 -0
- package/src/interfaces/IState.d.ts.map +1 -0
- package/src/interfaces/IState.ts +1 -0
- package/src/interfaces/IThickness.d.ts.map +1 -0
- package/src/interfaces/IThickness.ts +1 -1
- package/{lib → src}/webcomponent/DockSpawnTsWebcomponent.d.ts +4 -4
- package/src/webcomponent/DockSpawnTsWebcomponent.d.ts.map +1 -0
- package/{lib → src}/webcomponent/DockSpawnTsWebcomponent.js +69 -61
- package/src/webcomponent/DockSpawnTsWebcomponent.ts +239 -241
- package/src/webcomponent/styles.d.ts.map +1 -0
- package/{lib → src}/webcomponent/styles.js +2 -1
- package/tsconfig.json +13 -26
- package/.eslintrc.json +0 -47
- package/lib/BrowserDialogHelper.d.ts.map +0 -1
- package/lib/ContainerType.d.ts.map +0 -1
- package/lib/Dialog.d.ts.map +0 -1
- package/lib/DockConfig.d.ts.map +0 -1
- package/lib/DockGraphDeserializer.d.ts.map +0 -1
- package/lib/DockGraphDeserializer.js +0 -114
- package/lib/DockGraphSerializer.d.ts +0 -14
- package/lib/DockGraphSerializer.d.ts.map +0 -1
- package/lib/DockLayoutEngine.d.ts.map +0 -1
- package/lib/DockManager.d.ts.map +0 -1
- package/lib/DockManagerContext.d.ts.map +0 -1
- package/lib/DockModel.d.ts.map +0 -1
- package/lib/DockNode.d.ts.map +0 -1
- package/lib/DockWheel.d.ts.map +0 -1
- package/lib/DockWheelItem.d.ts.map +0 -1
- package/lib/DocumentManagerContainer.d.ts.map +0 -1
- package/lib/DocumentTabPage.d.ts.map +0 -1
- package/lib/DraggableContainer.d.ts.map +0 -1
- package/lib/EventHandler.d.ts.map +0 -1
- package/lib/FillDockContainer.d.ts.map +0 -1
- package/lib/HorizontalDockContainer.d.ts +0 -7
- package/lib/HorizontalDockContainer.d.ts.map +0 -1
- package/lib/PanelContainer.d.ts.map +0 -1
- package/lib/Point.d.ts.map +0 -1
- package/lib/ResizableContainer.d.ts.map +0 -1
- package/lib/ResizeHandle.d.ts.map +0 -1
- package/lib/SplitterBar.d.ts.map +0 -1
- package/lib/SplitterDockContainer.d.ts.map +0 -1
- package/lib/SplitterPanel.d.ts.map +0 -1
- package/lib/TabHandle.d.ts.map +0 -1
- package/lib/TabHost.d.ts.map +0 -1
- package/lib/TabPage.d.ts.map +0 -1
- package/lib/UndockInitiator.d.ts.map +0 -1
- package/lib/Utils.d.ts.map +0 -1
- package/lib/VerticalDockContainer.d.ts +0 -7
- package/lib/VerticalDockContainer.d.ts.map +0 -1
- package/lib/enums/PanelType.d.ts.map +0 -1
- package/lib/enums/TabHostDirection.d.ts.map +0 -1
- package/lib/enums/WheelTypes.d.ts.map +0 -1
- package/lib/i18n/Defaults.d.ts.map +0 -1
- package/lib/i18n/Localizer.d.ts.map +0 -1
- package/lib/index.d.ts.map +0 -1
- package/lib/interfaces/IDockContainer.d.ts.map +0 -1
- package/lib/interfaces/IDockContainerWithSize.d.ts +0 -6
- package/lib/interfaces/IDockContainerWithSize.d.ts.map +0 -1
- package/lib/interfaces/ILayoutEventListener.d.ts.map +0 -1
- package/lib/interfaces/IMouseOrTouchEvent.d.ts.map +0 -1
- package/lib/interfaces/INodeInfo.d.ts +0 -8
- package/lib/interfaces/INodeInfo.d.ts.map +0 -1
- package/lib/interfaces/IPanelInfo.d.ts +0 -10
- package/lib/interfaces/IPanelInfo.d.ts.map +0 -1
- package/lib/interfaces/IRectangle.d.ts.map +0 -1
- package/lib/interfaces/ISize.d.ts.map +0 -1
- package/lib/interfaces/IState.d.ts.map +0 -1
- package/lib/interfaces/IThickness.d.ts.map +0 -1
- package/lib/webcomponent/DockSpawnTsWebcomponent.d.ts.map +0 -1
- package/lib/webcomponent/styles.d.ts.map +0 -1
- package/tsconfig.tsbuildinfo +0 -1
- /package/{lib → src}/BrowserDialogHelper.d.ts +0 -0
- /package/{lib → src}/ContainerType.d.ts +0 -0
- /package/{lib → src}/ContainerType.js +0 -0
- /package/{lib → src}/DockConfig.d.ts +0 -0
- /package/{lib → src}/EventHandler.d.ts +0 -0
- /package/{lib → src}/Point.d.ts +0 -0
- /package/{lib → src}/Utils.d.ts +0 -0
- /package/{lib → src}/enums/PanelType.d.ts +0 -0
- /package/{lib → src}/enums/PanelType.js +0 -0
- /package/{lib → src}/enums/TabHostDirection.d.ts +0 -0
- /package/{lib → src}/enums/TabHostDirection.js +0 -0
- /package/{lib → src}/enums/WheelTypes.d.ts +0 -0
- /package/{lib → src}/enums/WheelTypes.js +0 -0
- /package/{lib → src}/i18n/Defaults.d.ts +0 -0
- /package/{lib → src}/i18n/Defaults.js +0 -0
- /package/{lib → src}/index.d.ts +0 -0
- /package/{lib → src}/index.js +0 -0
- /package/{lib → src}/interfaces/IDockContainer.js +0 -0
- /package/{lib → src}/interfaces/IDockContainerWithSize.js +0 -0
- /package/{lib → src}/interfaces/ILayoutEventListener.js +0 -0
- /package/{lib → src}/interfaces/IMouseOrTouchEvent.d.ts +0 -0
- /package/{lib → src}/interfaces/IMouseOrTouchEvent.js +0 -0
- /package/{lib → src}/interfaces/INodeInfo.js +0 -0
- /package/{lib → src}/interfaces/IPanelInfo.js +0 -0
- /package/{lib → src}/interfaces/IRectangle.d.ts +0 -0
- /package/{lib → src}/interfaces/IRectangle.js +0 -0
- /package/{lib → src}/interfaces/ISize.d.ts +0 -0
- /package/{lib → src}/interfaces/ISize.js +0 -0
- /package/{lib → src}/interfaces/IState.js +0 -0
- /package/{lib → src}/interfaces/IThickness.d.ts +0 -0
- /package/{lib → src}/interfaces/IThickness.js +0 -0
- /package/{lib → src}/webcomponent/styles.d.ts +0 -0
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import { DockModel } from "./DockModel";
|
|
11
|
+
import { DockNode } from "./DockNode";
|
|
12
|
+
import { PanelContainer } from "./PanelContainer";
|
|
13
|
+
import { HorizontalDockContainer } from "./HorizontalDockContainer";
|
|
14
|
+
import { VerticalDockContainer } from "./VerticalDockContainer";
|
|
15
|
+
import { DocumentManagerContainer } from "./DocumentManagerContainer";
|
|
16
|
+
import { FillDockContainer } from "./FillDockContainer";
|
|
17
|
+
import { Dialog } from "./Dialog";
|
|
18
|
+
import { Utils } from "./Utils";
|
|
19
|
+
/**
|
|
20
|
+
* Deserializes the dock layout hierarchy from JSON and creates a dock hierarhcy graph
|
|
21
|
+
*/
|
|
22
|
+
export class DockGraphDeserializer {
|
|
23
|
+
constructor(dockManager) {
|
|
24
|
+
this.dockManager = dockManager;
|
|
25
|
+
}
|
|
26
|
+
deserialize(_json) {
|
|
27
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
28
|
+
let info = JSON.parse(_json);
|
|
29
|
+
let model = new DockModel();
|
|
30
|
+
model.rootNode = yield this._buildGraph(info.graphInfo);
|
|
31
|
+
model.dialogs = yield this._buildDialogs(info.dialogsInfo);
|
|
32
|
+
model.documentManagerNode = this.documentManagerNode;
|
|
33
|
+
return model;
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
_buildGraph(nodeInfo) {
|
|
37
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
38
|
+
let childrenInfo = nodeInfo.children;
|
|
39
|
+
let children = [];
|
|
40
|
+
for (let childInfo of childrenInfo) {
|
|
41
|
+
let childNode = yield this._buildGraph(childInfo);
|
|
42
|
+
if (childNode !== null) {
|
|
43
|
+
children.push(childNode);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
;
|
|
47
|
+
// Build the container owned by this node
|
|
48
|
+
let container = yield this._createContainer(nodeInfo, children);
|
|
49
|
+
if (container === null) {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
// Build the node for this container and attach it's children
|
|
53
|
+
let node = new DockNode(container);
|
|
54
|
+
if (container instanceof DocumentManagerContainer)
|
|
55
|
+
this.documentManagerNode = node;
|
|
56
|
+
node.children = children;
|
|
57
|
+
for (let childNode of node.children.reverse()) {
|
|
58
|
+
childNode.parent = node;
|
|
59
|
+
}
|
|
60
|
+
;
|
|
61
|
+
node.children.reverse();
|
|
62
|
+
// node.container.setActiveChild(node.container);
|
|
63
|
+
return node;
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
_createContainer(nodeInfo, children) {
|
|
67
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
68
|
+
let containerType = nodeInfo.containerType;
|
|
69
|
+
let containerState = nodeInfo.state;
|
|
70
|
+
let container;
|
|
71
|
+
let childContainers = [];
|
|
72
|
+
for (let childNode of children) {
|
|
73
|
+
childContainers.push(childNode.container);
|
|
74
|
+
}
|
|
75
|
+
if (containerType === 'panel') {
|
|
76
|
+
container = yield PanelContainer.loadFromState(containerState, this.dockManager);
|
|
77
|
+
if (!(container === null || container === void 0 ? void 0 : container.prepareForDocking))
|
|
78
|
+
return null;
|
|
79
|
+
container.prepareForDocking();
|
|
80
|
+
Utils.removeNode(container.elementPanel);
|
|
81
|
+
}
|
|
82
|
+
else if (containerType === 'horizontal')
|
|
83
|
+
container = new HorizontalDockContainer(this.dockManager, childContainers);
|
|
84
|
+
else if (containerType === 'vertical')
|
|
85
|
+
container = new VerticalDockContainer(this.dockManager, childContainers);
|
|
86
|
+
else if (containerType === 'fill') {
|
|
87
|
+
// Check if this is a document manager
|
|
88
|
+
// TODO: Layout engine compares the string 'fill', so cannot create another subclass type
|
|
89
|
+
// called document_manager and have to resort to this hack. use RTTI in layout engine
|
|
90
|
+
let typeDocumentManager = containerState.documentManager;
|
|
91
|
+
if (typeDocumentManager)
|
|
92
|
+
container = new DocumentManagerContainer(this.dockManager);
|
|
93
|
+
else
|
|
94
|
+
container = new FillDockContainer(this.dockManager);
|
|
95
|
+
}
|
|
96
|
+
else
|
|
97
|
+
throw new Error('Cannot create dock container of unknown type: ' + containerType);
|
|
98
|
+
// Restore the state of the container
|
|
99
|
+
container.loadState(containerState);
|
|
100
|
+
// container.performLayout(childContainers);
|
|
101
|
+
return container;
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
_buildDialogs(dialogsInfo) {
|
|
105
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
106
|
+
let dialogs = [];
|
|
107
|
+
for (let dialogInfo of dialogsInfo) {
|
|
108
|
+
let containerType = dialogInfo.containerType;
|
|
109
|
+
let containerState = dialogInfo.state;
|
|
110
|
+
let container;
|
|
111
|
+
if (containerType === 'panel') {
|
|
112
|
+
container = yield PanelContainer.loadFromState(containerState, this.dockManager);
|
|
113
|
+
if (container.prepareForDocking) {
|
|
114
|
+
Utils.removeNode(container.elementPanel);
|
|
115
|
+
container.isDialog = true;
|
|
116
|
+
let dialog = new Dialog(container, this.dockManager);
|
|
117
|
+
if (dialogInfo.position.x > document.body.clientWidth ||
|
|
118
|
+
dialogInfo.position.y > document.body.clientHeight - 70) {
|
|
119
|
+
dialogInfo.position.x = 20;
|
|
120
|
+
dialogInfo.position.y = 70;
|
|
121
|
+
}
|
|
122
|
+
dialog.setPosition(dialogInfo.position.x, dialogInfo.position.y);
|
|
123
|
+
dialog.isHidden = dialogInfo.isHidden;
|
|
124
|
+
if (dialog.isHidden)
|
|
125
|
+
dialog.hide();
|
|
126
|
+
dialogs.push(dialog);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return dialogs;
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
}
|
|
@@ -1,129 +1,134 @@
|
|
|
1
|
-
import {DockManager} from
|
|
2
|
-
import {DockModel} from
|
|
3
|
-
import {DockNode} from
|
|
4
|
-
import {PanelContainer} from
|
|
5
|
-
import {HorizontalDockContainer} from
|
|
6
|
-
import {VerticalDockContainer} from
|
|
7
|
-
import {DocumentManagerContainer} from
|
|
8
|
-
import {FillDockContainer} from
|
|
9
|
-
import {Dialog} from
|
|
10
|
-
import {Utils} from
|
|
11
|
-
import {IPanelInfo} from
|
|
12
|
-
import {INodeInfo} from
|
|
13
|
-
import {IDockContainer} from
|
|
1
|
+
import { DockManager } from "./DockManager";
|
|
2
|
+
import { DockModel } from "./DockModel";
|
|
3
|
+
import { DockNode } from "./DockNode";
|
|
4
|
+
import { PanelContainer } from "./PanelContainer";
|
|
5
|
+
import { HorizontalDockContainer } from "./HorizontalDockContainer";
|
|
6
|
+
import { VerticalDockContainer } from "./VerticalDockContainer";
|
|
7
|
+
import { DocumentManagerContainer } from "./DocumentManagerContainer";
|
|
8
|
+
import { FillDockContainer } from "./FillDockContainer";
|
|
9
|
+
import { Dialog } from "./Dialog";
|
|
10
|
+
import { Utils } from "./Utils";
|
|
11
|
+
import { IPanelInfo } from "./interfaces/IPanelInfo";
|
|
12
|
+
import { INodeInfo } from "./interfaces/INodeInfo";
|
|
13
|
+
import { IDockContainer } from "./interfaces/IDockContainer";
|
|
14
14
|
|
|
15
15
|
/**
|
|
16
16
|
* Deserializes the dock layout hierarchy from JSON and creates a dock hierarhcy graph
|
|
17
17
|
*/
|
|
18
18
|
export class DockGraphDeserializer {
|
|
19
|
-
dockManager: DockManager;
|
|
20
|
-
documentManagerNode: DockNode;
|
|
21
19
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
}
|
|
20
|
+
dockManager: DockManager;
|
|
21
|
+
documentManagerNode: DockNode;
|
|
25
22
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
model.rootNode = await this._buildGraph(info.graphInfo);
|
|
30
|
-
model.dialogs = await this._buildDialogs(info.dialogsInfo);
|
|
31
|
-
model.documentManagerNode = this.documentManagerNode;
|
|
32
|
-
return model;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
async _buildGraph(nodeInfo: INodeInfo) {
|
|
36
|
-
const childrenInfo = nodeInfo.children;
|
|
37
|
-
const children: DockNode[] = [];
|
|
38
|
-
for (const childInfo of childrenInfo) {
|
|
39
|
-
const childNode = await this._buildGraph(childInfo);
|
|
40
|
-
if (childNode !== null)
|
|
41
|
-
children.push(childNode);
|
|
42
|
-
};
|
|
23
|
+
constructor(dockManager: DockManager) {
|
|
24
|
+
this.dockManager = dockManager;
|
|
25
|
+
}
|
|
43
26
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
27
|
+
async deserialize(_json: string): Promise<DockModel> {
|
|
28
|
+
let info = JSON.parse(_json);
|
|
29
|
+
let model = new DockModel();
|
|
30
|
+
model.rootNode = await this._buildGraph(info.graphInfo);
|
|
31
|
+
model.dialogs = await this._buildDialogs(info.dialogsInfo);
|
|
32
|
+
model.documentManagerNode = this.documentManagerNode;
|
|
33
|
+
return model;
|
|
34
|
+
}
|
|
48
35
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
// node.container.setActiveChild(node.container);
|
|
59
|
-
return node;
|
|
60
|
-
}
|
|
36
|
+
async _buildGraph(nodeInfo: INodeInfo) {
|
|
37
|
+
let childrenInfo = nodeInfo.children;
|
|
38
|
+
let children: DockNode[] = [];
|
|
39
|
+
for (let childInfo of childrenInfo) {
|
|
40
|
+
let childNode = await this._buildGraph(childInfo);
|
|
41
|
+
if (childNode !== null) {
|
|
42
|
+
children.push(childNode);
|
|
43
|
+
}
|
|
44
|
+
};
|
|
61
45
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
46
|
+
// Build the container owned by this node
|
|
47
|
+
let container = await this._createContainer(nodeInfo, children);
|
|
48
|
+
if (container === null) {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
// Build the node for this container and attach it's children
|
|
52
|
+
let node = new DockNode(container);
|
|
53
|
+
if (container instanceof DocumentManagerContainer)
|
|
54
|
+
this.documentManagerNode = node;
|
|
55
|
+
node.children = children;
|
|
56
|
+
for (let childNode of node.children.reverse()) {
|
|
57
|
+
childNode.parent = node;
|
|
58
|
+
};
|
|
59
|
+
node.children.reverse();
|
|
60
|
+
// node.container.setActiveChild(node.container);
|
|
61
|
+
return node;
|
|
62
|
+
}
|
|
66
63
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
64
|
+
async _createContainer(nodeInfo: INodeInfo, children: DockNode[]) {
|
|
65
|
+
let containerType = nodeInfo.containerType;
|
|
66
|
+
let containerState = nodeInfo.state;
|
|
67
|
+
let container;
|
|
70
68
|
|
|
69
|
+
let childContainers: IDockContainer[] = [];
|
|
70
|
+
for (let childNode of children) {
|
|
71
|
+
childContainers.push(childNode.container);
|
|
72
|
+
}
|
|
71
73
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
74
|
+
if (containerType === 'panel') {
|
|
75
|
+
container = await PanelContainer.loadFromState(containerState, this.dockManager);
|
|
76
|
+
if (!container?.prepareForDocking)
|
|
77
|
+
return null;
|
|
78
|
+
container.prepareForDocking();
|
|
79
|
+
Utils.removeNode(container.elementPanel);
|
|
80
|
+
}
|
|
81
|
+
else if (containerType === 'horizontal')
|
|
82
|
+
container = new HorizontalDockContainer(this.dockManager, childContainers);
|
|
83
|
+
else if (containerType === 'vertical')
|
|
84
|
+
container = new VerticalDockContainer(this.dockManager, childContainers);
|
|
85
|
+
else if (containerType === 'fill') {
|
|
86
|
+
// Check if this is a document manager
|
|
84
87
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
88
|
+
// TODO: Layout engine compares the string 'fill', so cannot create another subclass type
|
|
89
|
+
// called document_manager and have to resort to this hack. use RTTI in layout engine
|
|
90
|
+
let typeDocumentManager = containerState.documentManager;
|
|
91
|
+
if (typeDocumentManager)
|
|
92
|
+
container = new DocumentManagerContainer(this.dockManager);
|
|
93
|
+
else
|
|
94
|
+
container = new FillDockContainer(this.dockManager);
|
|
95
|
+
}
|
|
96
|
+
else
|
|
97
|
+
throw new Error('Cannot create dock container of unknown type: ' + containerType);
|
|
94
98
|
|
|
95
|
-
|
|
96
|
-
|
|
99
|
+
// Restore the state of the container
|
|
100
|
+
container.loadState(containerState);
|
|
97
101
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
102
|
+
// container.performLayout(childContainers);
|
|
103
|
+
return container;
|
|
104
|
+
}
|
|
101
105
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
106
|
+
async _buildDialogs(dialogsInfo: IPanelInfo[]) {
|
|
107
|
+
let dialogs: Dialog[] = [];
|
|
108
|
+
for (let dialogInfo of dialogsInfo) {
|
|
109
|
+
let containerType = dialogInfo.containerType;
|
|
110
|
+
let containerState = dialogInfo.state;
|
|
111
|
+
let container;
|
|
112
|
+
if (containerType === 'panel') {
|
|
113
|
+
container = await PanelContainer.loadFromState(containerState, this.dockManager);
|
|
114
|
+
if (container.prepareForDocking) {
|
|
115
|
+
Utils.removeNode(container.elementPanel);
|
|
116
|
+
container.isDialog = true;
|
|
117
|
+
let dialog = new Dialog(container, this.dockManager);
|
|
118
|
+
if (dialogInfo.position.x > document.body.clientWidth ||
|
|
115
119
|
dialogInfo.position.y > document.body.clientHeight - 70) {
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
120
|
+
dialogInfo.position.x = 20;
|
|
121
|
+
dialogInfo.position.y = 70;
|
|
122
|
+
}
|
|
123
|
+
dialog.setPosition(dialogInfo.position.x, dialogInfo.position.y);
|
|
124
|
+
dialog.isHidden = dialogInfo.isHidden;
|
|
125
|
+
if (dialog.isHidden)
|
|
126
|
+
dialog.hide();
|
|
127
|
+
dialogs.push(dialog);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
124
131
|
}
|
|
125
|
-
|
|
132
|
+
return dialogs;
|
|
126
133
|
}
|
|
127
|
-
return dialogs;
|
|
128
|
-
}
|
|
129
134
|
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { DockModel } from "./DockModel";
|
|
2
|
+
import { DockNode } from "./DockNode";
|
|
3
|
+
import { Dialog } from "./Dialog";
|
|
4
|
+
import { IPanelInfo } from "./interfaces/IPanelInfo";
|
|
5
|
+
import { INodeInfo } from "./interfaces/INodeInfo";
|
|
6
|
+
/**
|
|
7
|
+
* The serializer saves / loads the state of the dock layout hierarchy
|
|
8
|
+
*/
|
|
9
|
+
export declare class DockGraphSerializer {
|
|
10
|
+
serialize(model: DockModel): string;
|
|
11
|
+
_buildGraphInfo(node: DockNode): INodeInfo;
|
|
12
|
+
_buildDialogsInfo(dialogs: Dialog[]): IPanelInfo[];
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=DockGraphSerializer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DockGraphSerializer.d.ts","sourceRoot":"","sources":["DockGraphSerializer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAGnD;;GAEG;AACH,qBAAa,mBAAmB;IAE5B,SAAS,CAAC,KAAK,EAAE,SAAS;IAM1B,eAAe,CAAC,IAAI,EAAE,QAAQ,GAAG,SAAS;IAiB1C,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,UAAU,EAAE;CAkBrD"}
|
|
@@ -3,35 +3,35 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export class DockGraphSerializer {
|
|
5
5
|
serialize(model) {
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
let graphInfo = this._buildGraphInfo(model.rootNode);
|
|
7
|
+
let dialogs = this._buildDialogsInfo(model.dialogs.sort((x, y) => x.elementDialog.style.zIndex - y.elementDialog.style.zIndex));
|
|
8
8
|
return JSON.stringify({ graphInfo: graphInfo, dialogsInfo: dialogs });
|
|
9
9
|
}
|
|
10
10
|
_buildGraphInfo(node) {
|
|
11
|
-
|
|
11
|
+
let nodeState = {};
|
|
12
12
|
node.container.saveState(nodeState);
|
|
13
|
-
|
|
13
|
+
let childrenInfo = [];
|
|
14
14
|
node.children.forEach((childNode) => {
|
|
15
15
|
childrenInfo.push(this._buildGraphInfo(childNode));
|
|
16
16
|
});
|
|
17
|
-
|
|
17
|
+
let nodeInfo = {
|
|
18
18
|
containerType: node.container.containerType,
|
|
19
19
|
state: nodeState,
|
|
20
|
-
children: childrenInfo
|
|
20
|
+
children: childrenInfo
|
|
21
21
|
};
|
|
22
22
|
return nodeInfo;
|
|
23
23
|
}
|
|
24
24
|
_buildDialogsInfo(dialogs) {
|
|
25
|
-
|
|
25
|
+
let dialogsInfo = [];
|
|
26
26
|
dialogs.forEach((dialog) => {
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
let panelState = {};
|
|
28
|
+
let panelContainer = dialog.panel;
|
|
29
29
|
panelContainer.saveState(panelState);
|
|
30
|
-
|
|
30
|
+
let panelInfo = {
|
|
31
31
|
containerType: panelContainer.containerType,
|
|
32
32
|
state: panelState,
|
|
33
33
|
position: dialog.getPosition(),
|
|
34
|
-
isHidden: dialog.isHidden
|
|
34
|
+
isHidden: dialog.isHidden
|
|
35
35
|
};
|
|
36
36
|
dialogsInfo.push(panelInfo);
|
|
37
37
|
});
|
|
@@ -1,53 +1,54 @@
|
|
|
1
|
-
import {DockModel} from
|
|
2
|
-
import {DockNode} from
|
|
3
|
-
import {Dialog} from
|
|
4
|
-
import {IPanelInfo} from
|
|
5
|
-
import {INodeInfo} from
|
|
6
|
-
import {IState} from
|
|
1
|
+
import { DockModel } from "./DockModel";
|
|
2
|
+
import { DockNode } from "./DockNode";
|
|
3
|
+
import { Dialog } from "./Dialog";
|
|
4
|
+
import { IPanelInfo } from "./interfaces/IPanelInfo";
|
|
5
|
+
import { INodeInfo } from "./interfaces/INodeInfo";
|
|
6
|
+
import { IState } from "./interfaces/IState";
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
9
|
* The serializer saves / loads the state of the dock layout hierarchy
|
|
10
10
|
*/
|
|
11
11
|
export class DockGraphSerializer {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
12
|
+
|
|
13
|
+
serialize(model: DockModel) {
|
|
14
|
+
let graphInfo = this._buildGraphInfo(model.rootNode);
|
|
15
|
+
let dialogs = this._buildDialogsInfo(model.dialogs.sort((x,y)=><number><any>x.elementDialog.style.zIndex-<number><any>y.elementDialog.style.zIndex));
|
|
16
|
+
return JSON.stringify({ graphInfo: graphInfo, dialogsInfo: dialogs });
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
_buildGraphInfo(node: DockNode): INodeInfo {
|
|
20
|
+
let nodeState: IState = {};
|
|
21
|
+
node.container.saveState(nodeState);
|
|
22
|
+
|
|
23
|
+
let childrenInfo: INodeInfo[] = [];
|
|
24
|
+
node.children.forEach((childNode) => {
|
|
25
|
+
childrenInfo.push(this._buildGraphInfo(childNode));
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
let nodeInfo: INodeInfo = {
|
|
29
|
+
containerType: node.container.containerType,
|
|
30
|
+
state: nodeState,
|
|
31
|
+
children: childrenInfo
|
|
32
|
+
};
|
|
33
|
+
return nodeInfo;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
_buildDialogsInfo(dialogs: Dialog[]): IPanelInfo[] {
|
|
37
|
+
let dialogsInfo: IPanelInfo[] = [];
|
|
38
|
+
dialogs.forEach((dialog) => {
|
|
39
|
+
let panelState: IState = {};
|
|
40
|
+
let panelContainer = dialog.panel;
|
|
41
|
+
panelContainer.saveState(panelState);
|
|
42
|
+
|
|
43
|
+
let panelInfo: IPanelInfo = {
|
|
44
|
+
containerType: panelContainer.containerType,
|
|
45
|
+
state: panelState,
|
|
46
|
+
position: dialog.getPosition(),
|
|
47
|
+
isHidden: dialog.isHidden
|
|
48
|
+
}
|
|
49
|
+
dialogsInfo.push(panelInfo);
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
return dialogsInfo;
|
|
53
|
+
}
|
|
53
54
|
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { DockManager } from
|
|
2
|
-
import { DockNode } from
|
|
3
|
-
import { HorizontalDockContainer } from
|
|
4
|
-
import { VerticalDockContainer } from
|
|
5
|
-
import { FillDockContainer } from
|
|
6
|
-
import { IRectangle } from
|
|
7
|
-
import { IDockContainer } from
|
|
8
|
-
import { TabHandle } from
|
|
1
|
+
import { DockManager } from "./DockManager";
|
|
2
|
+
import { DockNode } from "./DockNode";
|
|
3
|
+
import { HorizontalDockContainer } from "./HorizontalDockContainer";
|
|
4
|
+
import { VerticalDockContainer } from "./VerticalDockContainer";
|
|
5
|
+
import { FillDockContainer } from "./FillDockContainer";
|
|
6
|
+
import { IRectangle } from "./interfaces/IRectangle";
|
|
7
|
+
import { IDockContainer } from "./interfaces/IDockContainer";
|
|
8
|
+
import { TabHandle } from "./TabHandle";
|
|
9
9
|
export declare class DockLayoutEngine {
|
|
10
10
|
dockManager: DockManager;
|
|
11
11
|
constructor(dockManager: DockManager);
|
|
@@ -26,10 +26,10 @@ export declare class DockLayoutEngine {
|
|
|
26
26
|
_forceResizeCompositeContainer: (container: IDockContainer) => void;
|
|
27
27
|
_createDockContainer(containerType: string, newNode: DockNode, referenceNode: DockNode): FillDockContainer | HorizontalDockContainer | VerticalDockContainer;
|
|
28
28
|
/**
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
29
|
+
* Gets the bounds of the new node if it were to dock with the specified configuration
|
|
30
|
+
* The state is not modified in this function. It is used for showing a preview of where
|
|
31
|
+
* the panel would be docked when hovered over a dock wheel button
|
|
32
|
+
*/
|
|
33
33
|
getDockBounds(referenceNode: DockNode, containerToDock: IDockContainer, direction: string, insertBeforeReference: boolean): IRectangle;
|
|
34
34
|
_getVaringDimension(container: IDockContainer, direction: string): number;
|
|
35
35
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DockLayoutEngine.d.ts","sourceRoot":"","sources":["DockLayoutEngine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,qBAAa,gBAAgB;IAEzB,WAAW,EAAE,WAAW,CAAC;gBAEb,WAAW,EAAE,WAAW;IAIpC,yDAAyD;IACzD,QAAQ,CAAC,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ;IAInD,0DAA0D;IAC1D,SAAS,CAAC,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ;IAIpD,wDAAwD;IACxD,MAAM,CAAC,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ;IAIjD,2DAA2D;IAC3D,QAAQ,CAAC,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ;IAInD,uEAAuE;IACvE,QAAQ,CAAC,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ;IAInD,MAAM,CAAC,IAAI,EAAE,QAAQ;IAqDrB,KAAK,CAAC,IAAI,EAAE,QAAQ;IA2DpB,WAAW,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAiB3E,YAAY,CAAC,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,qBAAqB,EAAE,OAAO;IAiG1G,8BAA8B,cAAe,cAAc,UAI1D;IAED,oBAAoB,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ;IAWtF;;;;OAIG;IACH,aAAa,CAAC,aAAa,EAAE,QAAQ,EAAE,eAAe,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,EAAE,qBAAqB,EAAE,OAAO,GAAG,UAAU;IA4EtI,mBAAmB,CAAC,SAAS,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM;CAO5E"}
|