@datagrok-libraries/dock-spawn-dg 0.0.1

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 (222) hide show
  1. package/.eslintrc.json +47 -0
  2. package/CHANGELOG.md +355 -0
  3. package/LICENSE +21 -0
  4. package/README.md +11 -0
  5. package/css/dock-manager-context-menu.css +19 -0
  6. package/css/dock-manager-style.css +190 -0
  7. package/css/dock-manager.css +411 -0
  8. package/images/close.svg +6 -0
  9. package/images/dock_bottom.png +0 -0
  10. package/images/dock_bottom_sel.png +0 -0
  11. package/images/dock_fill.png +0 -0
  12. package/images/dock_fill_sel.png +0 -0
  13. package/images/dock_left.png +0 -0
  14. package/images/dock_left_sel.png +0 -0
  15. package/images/dock_right.png +0 -0
  16. package/images/dock_right_sel.png +0 -0
  17. package/images/dock_top.png +0 -0
  18. package/images/dock_top_sel.png +0 -0
  19. package/index.ts +32 -0
  20. package/lib/BrowserDialogHelper.d.ts +8 -0
  21. package/lib/BrowserDialogHelper.d.ts.map +1 -0
  22. package/lib/BrowserDialogHelper.js +60 -0
  23. package/lib/ContainerType.d.ts +7 -0
  24. package/lib/ContainerType.d.ts.map +1 -0
  25. package/lib/ContainerType.js +7 -0
  26. package/lib/Dialog.d.ts +51 -0
  27. package/lib/Dialog.d.ts.map +1 -0
  28. package/lib/Dialog.js +209 -0
  29. package/lib/DockConfig.d.ts +9 -0
  30. package/lib/DockConfig.d.ts.map +1 -0
  31. package/lib/DockConfig.js +14 -0
  32. package/lib/DockGraphDeserializer.d.ts +19 -0
  33. package/lib/DockGraphDeserializer.d.ts.map +1 -0
  34. package/lib/DockGraphDeserializer.js +114 -0
  35. package/lib/DockGraphSerializer.d.ts +14 -0
  36. package/lib/DockGraphSerializer.d.ts.map +1 -0
  37. package/lib/DockGraphSerializer.js +40 -0
  38. package/lib/DockLayoutEngine.d.ts +36 -0
  39. package/lib/DockLayoutEngine.d.ts.map +1 -0
  40. package/lib/DockLayoutEngine.js +323 -0
  41. package/lib/DockManager.d.ts +155 -0
  42. package/lib/DockManager.d.ts.map +1 -0
  43. package/lib/DockManager.js +752 -0
  44. package/lib/DockManagerContext.d.ts +10 -0
  45. package/lib/DockManagerContext.d.ts.map +1 -0
  46. package/lib/DockManagerContext.js +12 -0
  47. package/lib/DockModel.d.ts +9 -0
  48. package/lib/DockModel.d.ts.map +1 -0
  49. package/lib/DockModel.js +8 -0
  50. package/lib/DockNode.d.ts +16 -0
  51. package/lib/DockNode.d.ts.map +1 -0
  52. package/lib/DockNode.js +64 -0
  53. package/lib/DockWheel.d.ts +41 -0
  54. package/lib/DockWheel.d.ts.map +1 -0
  55. package/lib/DockWheel.js +208 -0
  56. package/lib/DockWheelItem.d.ts +16 -0
  57. package/lib/DockWheelItem.d.ts.map +1 -0
  58. package/lib/DockWheelItem.js +34 -0
  59. package/lib/DocumentManagerContainer.d.ts +16 -0
  60. package/lib/DocumentManagerContainer.d.ts.map +1 -0
  61. package/lib/DocumentManagerContainer.js +28 -0
  62. package/lib/DocumentTabPage.d.ts +11 -0
  63. package/lib/DocumentTabPage.d.ts.map +1 -0
  64. package/lib/DocumentTabPage.js +26 -0
  65. package/lib/DraggableContainer.d.ts +51 -0
  66. package/lib/DraggableContainer.d.ts.map +1 -0
  67. package/lib/DraggableContainer.js +145 -0
  68. package/lib/EventHandler.d.ts +8 -0
  69. package/lib/EventHandler.d.ts.map +1 -0
  70. package/lib/EventHandler.js +14 -0
  71. package/lib/FillDockContainer.d.ts +34 -0
  72. package/lib/FillDockContainer.d.ts.map +1 -0
  73. package/lib/FillDockContainer.js +80 -0
  74. package/lib/HorizontalDockContainer.d.ts +7 -0
  75. package/lib/HorizontalDockContainer.d.ts.map +1 -0
  76. package/lib/HorizontalDockContainer.js +9 -0
  77. package/lib/PanelContainer.d.ts +114 -0
  78. package/lib/PanelContainer.d.ts.map +1 -0
  79. package/lib/PanelContainer.js +517 -0
  80. package/lib/Point.d.ts +6 -0
  81. package/lib/Point.d.ts.map +1 -0
  82. package/lib/Point.js +8 -0
  83. package/lib/ResizableContainer.d.ts +56 -0
  84. package/lib/ResizableContainer.d.ts.map +1 -0
  85. package/lib/ResizableContainer.js +254 -0
  86. package/lib/ResizeHandle.d.ts +16 -0
  87. package/lib/ResizeHandle.d.ts.map +1 -0
  88. package/lib/ResizeHandle.js +58 -0
  89. package/lib/SplitterBar.d.ts +33 -0
  90. package/lib/SplitterBar.d.ts.map +1 -0
  91. package/lib/SplitterBar.js +137 -0
  92. package/lib/SplitterDockContainer.d.ts +36 -0
  93. package/lib/SplitterDockContainer.d.ts.map +1 -0
  94. package/lib/SplitterDockContainer.js +75 -0
  95. package/lib/SplitterPanel.d.ts +27 -0
  96. package/lib/SplitterPanel.d.ts.map +1 -0
  97. package/lib/SplitterPanel.js +195 -0
  98. package/lib/TabHandle.d.ts +56 -0
  99. package/lib/TabHandle.d.ts.map +1 -0
  100. package/lib/TabHandle.js +292 -0
  101. package/lib/TabHost.d.ts +47 -0
  102. package/lib/TabHost.d.ts.map +1 -0
  103. package/lib/TabHost.js +238 -0
  104. package/lib/TabPage.d.ts +20 -0
  105. package/lib/TabPage.d.ts.map +1 -0
  106. package/lib/TabPage.js +81 -0
  107. package/lib/UndockInitiator.d.ts +32 -0
  108. package/lib/UndockInitiator.d.ts.map +1 -0
  109. package/lib/UndockInitiator.js +152 -0
  110. package/lib/Utils.d.ts +15 -0
  111. package/lib/Utils.d.ts.map +1 -0
  112. package/lib/Utils.js +69 -0
  113. package/lib/VerticalDockContainer.d.ts +7 -0
  114. package/lib/VerticalDockContainer.d.ts.map +1 -0
  115. package/lib/VerticalDockContainer.js +9 -0
  116. package/lib/enums/PanelType.d.ts +5 -0
  117. package/lib/enums/PanelType.d.ts.map +1 -0
  118. package/lib/enums/PanelType.js +5 -0
  119. package/lib/enums/TabHostDirection.d.ts +7 -0
  120. package/lib/enums/TabHostDirection.d.ts.map +1 -0
  121. package/lib/enums/TabHostDirection.js +7 -0
  122. package/lib/enums/WheelTypes.d.ts +12 -0
  123. package/lib/enums/WheelTypes.d.ts.map +1 -0
  124. package/lib/enums/WheelTypes.js +14 -0
  125. package/lib/i18n/Defaults.d.ts +12 -0
  126. package/lib/i18n/Defaults.d.ts.map +1 -0
  127. package/lib/i18n/Defaults.js +9 -0
  128. package/lib/i18n/Localizer.d.ts +7 -0
  129. package/lib/i18n/Localizer.d.ts.map +1 -0
  130. package/lib/i18n/Localizer.js +16 -0
  131. package/lib/index.d.ts +33 -0
  132. package/lib/index.d.ts.map +1 -0
  133. package/lib/index.js +32 -0
  134. package/lib/interfaces/IDockContainer.d.ts +26 -0
  135. package/lib/interfaces/IDockContainer.d.ts.map +1 -0
  136. package/lib/interfaces/IDockContainer.js +1 -0
  137. package/lib/interfaces/IDockContainerWithSize.d.ts +6 -0
  138. package/lib/interfaces/IDockContainerWithSize.d.ts.map +1 -0
  139. package/lib/interfaces/IDockContainerWithSize.js +1 -0
  140. package/lib/interfaces/ILayoutEventListener.d.ts +27 -0
  141. package/lib/interfaces/ILayoutEventListener.d.ts.map +1 -0
  142. package/lib/interfaces/ILayoutEventListener.js +1 -0
  143. package/lib/interfaces/IMouseOrTouchEvent.d.ts +7 -0
  144. package/lib/interfaces/IMouseOrTouchEvent.d.ts.map +1 -0
  145. package/lib/interfaces/IMouseOrTouchEvent.js +1 -0
  146. package/lib/interfaces/INodeInfo.d.ts +8 -0
  147. package/lib/interfaces/INodeInfo.d.ts.map +1 -0
  148. package/lib/interfaces/INodeInfo.js +1 -0
  149. package/lib/interfaces/IPanelInfo.d.ts +10 -0
  150. package/lib/interfaces/IPanelInfo.d.ts.map +1 -0
  151. package/lib/interfaces/IPanelInfo.js +1 -0
  152. package/lib/interfaces/IRectangle.d.ts +7 -0
  153. package/lib/interfaces/IRectangle.d.ts.map +1 -0
  154. package/lib/interfaces/IRectangle.js +1 -0
  155. package/lib/interfaces/ISize.d.ts +5 -0
  156. package/lib/interfaces/ISize.d.ts.map +1 -0
  157. package/lib/interfaces/ISize.js +1 -0
  158. package/lib/interfaces/IState.d.ts +12 -0
  159. package/lib/interfaces/IState.d.ts.map +1 -0
  160. package/lib/interfaces/IState.js +1 -0
  161. package/lib/interfaces/IThickness.d.ts +7 -0
  162. package/lib/interfaces/IThickness.d.ts.map +1 -0
  163. package/lib/interfaces/IThickness.js +1 -0
  164. package/lib/webcomponent/DockSpawnTsWebcomponent.d.ts +35 -0
  165. package/lib/webcomponent/DockSpawnTsWebcomponent.d.ts.map +1 -0
  166. package/lib/webcomponent/DockSpawnTsWebcomponent.js +209 -0
  167. package/lib/webcomponent/styles.d.ts +5 -0
  168. package/lib/webcomponent/styles.d.ts.map +1 -0
  169. package/lib/webcomponent/styles.js +537 -0
  170. package/package.json +36 -0
  171. package/src/BrowserDialogHelper.ts +76 -0
  172. package/src/ContainerType.ts +6 -0
  173. package/src/Dialog.ts +253 -0
  174. package/src/DockConfig.ts +15 -0
  175. package/src/DockGraphDeserializer.ts +129 -0
  176. package/src/DockGraphSerializer.ts +53 -0
  177. package/src/DockLayoutEngine.ts +370 -0
  178. package/src/DockManager.ts +880 -0
  179. package/src/DockManagerContext.ts +16 -0
  180. package/src/DockModel.ts +12 -0
  181. package/src/DockNode.ts +81 -0
  182. package/src/DockWheel.ts +215 -0
  183. package/src/DockWheelItem.ts +41 -0
  184. package/src/DocumentManagerContainer.ts +39 -0
  185. package/src/DocumentTabPage.ts +35 -0
  186. package/src/DraggableContainer.ts +177 -0
  187. package/src/EventHandler.ts +17 -0
  188. package/src/FillDockContainer.ts +98 -0
  189. package/src/HorizontalDockContainer.ts +13 -0
  190. package/src/PanelContainer.ts +596 -0
  191. package/src/Point.ts +10 -0
  192. package/src/ResizableContainer.ts +293 -0
  193. package/src/ResizeHandle.ts +59 -0
  194. package/src/SplitterBar.ts +157 -0
  195. package/src/SplitterDockContainer.ts +95 -0
  196. package/src/SplitterPanel.ts +228 -0
  197. package/src/TabHandle.ts +347 -0
  198. package/src/TabHost.ts +267 -0
  199. package/src/TabPage.ts +98 -0
  200. package/src/UndockInitiator.ts +181 -0
  201. package/src/Utils.ts +85 -0
  202. package/src/VerticalDockContainer.ts +13 -0
  203. package/src/enums/PanelType.ts +4 -0
  204. package/src/enums/TabHostDirection.ts +6 -0
  205. package/src/enums/WheelTypes.ts +14 -0
  206. package/src/i18n/Defaults.ts +20 -0
  207. package/src/i18n/Localizer.ts +23 -0
  208. package/src/index.ts +32 -0
  209. package/src/interfaces/IDockContainer.ts +27 -0
  210. package/src/interfaces/IDockContainerWithSize.ts +6 -0
  211. package/src/interfaces/ILayoutEventListener.ts +28 -0
  212. package/src/interfaces/IMouseOrTouchEvent.ts +6 -0
  213. package/src/interfaces/INodeInfo.ts +8 -0
  214. package/src/interfaces/IPanelInfo.ts +10 -0
  215. package/src/interfaces/IRectangle.ts +6 -0
  216. package/src/interfaces/ISize.ts +4 -0
  217. package/src/interfaces/IState.ts +12 -0
  218. package/src/interfaces/IThickness.ts +6 -0
  219. package/src/webcomponent/DockSpawnTsWebcomponent.ts +248 -0
  220. package/src/webcomponent/styles.ts +544 -0
  221. package/tsconfig.json +74 -0
  222. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1,323 @@
1
+ import { DockNode } from './DockNode.js';
2
+ import { Utils } from './Utils.js';
3
+ import { HorizontalDockContainer } from './HorizontalDockContainer.js';
4
+ import { VerticalDockContainer } from './VerticalDockContainer.js';
5
+ import { FillDockContainer } from './FillDockContainer.js';
6
+ export class DockLayoutEngine {
7
+ dockManager;
8
+ constructor(dockManager) {
9
+ this.dockManager = dockManager;
10
+ }
11
+ /** docks the [newNode] to the left of [referenceNode] */
12
+ dockLeft(referenceNode, newNode) {
13
+ this._performDock(referenceNode, newNode, 'horizontal', true);
14
+ }
15
+ /** docks the [newNode] to the right of [referenceNode] */
16
+ dockRight(referenceNode, newNode) {
17
+ this._performDock(referenceNode, newNode, 'horizontal', false);
18
+ }
19
+ /** docks the [newNode] to the top of [referenceNode] */
20
+ dockUp(referenceNode, newNode) {
21
+ this._performDock(referenceNode, newNode, 'vertical', true);
22
+ }
23
+ /** docks the [newNode] to the bottom of [referenceNode] */
24
+ dockDown(referenceNode, newNode) {
25
+ this._performDock(referenceNode, newNode, 'vertical', false);
26
+ }
27
+ /** docks the [newNode] by creating a new tab inside [referenceNode] */
28
+ dockFill(referenceNode, newNode) {
29
+ this._performDock(referenceNode, newNode, 'fill', false);
30
+ }
31
+ undock(node) {
32
+ const parentNode = node.parent;
33
+ if (!parentNode)
34
+ throw new Error('Cannot undock. panel is not a leaf node');
35
+ // Get the position of the node relative to it's siblings
36
+ const siblingIndex = parentNode.children.indexOf(node);
37
+ // Detach the node from the dock manager's tree hierarchy
38
+ node.detachFromParent();
39
+ // Fix the node's parent hierarchy
40
+ if (parentNode.children.length < parentNode.container.minimumAllowedChildNodes) {
41
+ // If the child count falls below the minimum threshold, destroy the parent and merge
42
+ // the children with their grandparents
43
+ const grandParent = parentNode.parent;
44
+ for (let i = 0; i < parentNode.children.length; i++) {
45
+ const otherChild = parentNode.children[i];
46
+ if (grandParent) {
47
+ // parent node is not a root node
48
+ grandParent.addChildAfter(parentNode, otherChild);
49
+ parentNode.detachFromParent();
50
+ const width = parentNode.container.containerElement.clientWidth;
51
+ const height = parentNode.container.containerElement.clientHeight;
52
+ parentNode.container.destroy();
53
+ otherChild.container.resize(width, height);
54
+ grandParent.performLayout(false);
55
+ }
56
+ else {
57
+ // Parent is a root node.
58
+ // Make the other child the root node
59
+ parentNode.detachFromParent();
60
+ parentNode.container.destroy();
61
+ this.dockManager.setRootNode(otherChild);
62
+ }
63
+ }
64
+ }
65
+ else {
66
+ // the node to be removed has 2 or more other siblings. So it is safe to continue
67
+ // using the parent composite container.
68
+ parentNode.performLayout(false);
69
+ // Set the next sibling as the active child (e.g. for a Tab host, it would select it as the active tab)
70
+ if (parentNode.children.length > 0) {
71
+ const nextActiveSibling = parentNode.children[Math.max(0, siblingIndex - 1)];
72
+ parentNode.container.setActiveChild(nextActiveSibling.container);
73
+ }
74
+ }
75
+ this.dockManager.invalidate();
76
+ this.dockManager.notifyOnUnDock(node);
77
+ }
78
+ close(node) {
79
+ const parentNode = node?.parent;
80
+ if (!parentNode)
81
+ throw new Error('Cannot undock. panel is not a leaf node');
82
+ //check if closed tab was the active one
83
+ let activetabClosed = false;
84
+ if (parentNode.children.length > 0) {
85
+ if (parentNode.container.tabHost != null) {
86
+ const activeTab = parentNode.container.tabHost.getActiveTab();
87
+ activetabClosed = activeTab.container == node.container;
88
+ }
89
+ }
90
+ // Get the position of the node relative to it's siblings
91
+ const siblingIndex = parentNode.children.indexOf(node);
92
+ // Detach the node from the dock manager's tree hierarchy
93
+ node.detachFromParent();
94
+ if (parentNode.children.length < parentNode.container.minimumAllowedChildNodes) {
95
+ // If the child count falls below the minimum threshold, destroy the parent and merge
96
+ // the children with their grandparents
97
+ const grandParent = parentNode.parent;
98
+ for (let i = 0; i < parentNode.children.length; i++) {
99
+ const otherChild = parentNode.children[i];
100
+ if (grandParent) {
101
+ // parent node is not a root node
102
+ grandParent.addChildAfter(parentNode, otherChild);
103
+ parentNode.detachFromParent();
104
+ const width = parentNode.container.containerElement.clientWidth;
105
+ const height = parentNode.container.containerElement.clientHeight;
106
+ otherChild.container.resize(width, height);
107
+ parentNode.container.destroy();
108
+ grandParent.performLayout(false);
109
+ }
110
+ else {
111
+ // Parent is a root node.
112
+ // Make the other child the root node
113
+ parentNode.detachFromParent();
114
+ parentNode.container.destroy();
115
+ this.dockManager.setRootNode(otherChild);
116
+ }
117
+ }
118
+ }
119
+ else {
120
+ // the node to be removed has 2 or more other siblings. So it is safe to continue
121
+ // using the parent composite container.
122
+ parentNode.performLayout(false);
123
+ if (activetabClosed) {
124
+ const nextActiveSibling = parentNode.children[Math.max(0, siblingIndex - 1)];
125
+ if (nextActiveSibling != null)
126
+ parentNode.container.setActiveChild(nextActiveSibling.container);
127
+ }
128
+ }
129
+ this.dockManager.invalidate();
130
+ this.dockManager.notifyOnUnDock(node);
131
+ }
132
+ reorderTabs(node, handle, state, index) {
133
+ const N = node.children.length;
134
+ const nodeIndexToDelete = state === 'left' ? index : index + 1;
135
+ if (state == 'right' && nodeIndexToDelete >= node.children.length)
136
+ return;
137
+ if (state == 'left' && nodeIndexToDelete == 0)
138
+ return;
139
+ const indexes = Array.apply(null, { length: N }).map(Number.call, Number);
140
+ const indexValue = indexes.splice(nodeIndexToDelete, 1)[0]; //remove element
141
+ indexes.splice(state === 'left' ? index - 1 : index, 0, indexValue); //insert
142
+ node.children = Utils.orderByIndexes(node.children, indexes); //apply
143
+ node.container.tabHost.performTabsLayout(indexes);
144
+ this.dockManager.notifyOnTabsReorder(node);
145
+ }
146
+ _performDock(referenceNode, newNode, direction, insertBeforeReference) {
147
+ if (referenceNode.parent && referenceNode.parent.container.containerType === 'fill')
148
+ referenceNode = referenceNode.parent;
149
+ if (direction === 'fill' && referenceNode.container.containerType === 'fill') {
150
+ referenceNode.addChild(newNode);
151
+ referenceNode.performLayout(false);
152
+ referenceNode.container.setActiveChild(newNode.container);
153
+ this.dockManager.invalidate();
154
+ this.dockManager.notifyOnDock(newNode);
155
+ return;
156
+ }
157
+ // Check if reference node is root node
158
+ const model = this.dockManager.context.model;
159
+ let compositeContainer;
160
+ let compositeNode;
161
+ let referenceParent;
162
+ if (referenceNode === model.rootNode) {
163
+ if (insertBeforeReference) {
164
+ compositeContainer = this._createDockContainer(direction, newNode, referenceNode);
165
+ compositeNode = new DockNode(compositeContainer);
166
+ compositeNode.addChild(newNode);
167
+ compositeNode.addChild(referenceNode);
168
+ }
169
+ else {
170
+ compositeContainer = this._createDockContainer(direction, referenceNode, newNode);
171
+ compositeNode = new DockNode(compositeContainer);
172
+ compositeNode.addChild(referenceNode);
173
+ compositeNode.addChild(newNode);
174
+ }
175
+ // Attach the root node to the dock manager's DOM
176
+ this.dockManager.setRootNode(compositeNode);
177
+ this.dockManager.rebuildLayout(this.dockManager.context.model.rootNode);
178
+ compositeNode.container.setActiveChild(newNode.container);
179
+ this.dockManager.invalidate();
180
+ this.dockManager.notifyOnDock(newNode);
181
+ return;
182
+ }
183
+ if (referenceNode.parent.container.containerType !== direction) {
184
+ referenceParent = referenceNode.parent;
185
+ // Get the dimensions of the reference node, for resizing later on
186
+ const referenceNodeWidth = referenceNode.container.containerElement.clientWidth;
187
+ const referenceNodeHeight = referenceNode.container.containerElement.clientHeight;
188
+ // Get the dimensions of the reference node, for resizing later on
189
+ const referenceNodeParentWidth = referenceParent.container.containerElement.clientWidth;
190
+ const referenceNodeParentHeight = referenceParent.container.containerElement.clientHeight;
191
+ // Replace the reference node with a new composite node with the reference and new node as it's children
192
+ compositeContainer = this._createDockContainer(direction, newNode, referenceNode);
193
+ compositeNode = new DockNode(compositeContainer);
194
+ referenceParent.addChildAfter(referenceNode, compositeNode);
195
+ referenceNode.detachFromParent();
196
+ Utils.removeNode(referenceNode.container.containerElement);
197
+ if (insertBeforeReference) {
198
+ compositeNode.addChild(newNode);
199
+ compositeNode.addChild(referenceNode);
200
+ }
201
+ else {
202
+ compositeNode.addChild(referenceNode);
203
+ compositeNode.addChild(newNode);
204
+ }
205
+ referenceParent.performLayout(false);
206
+ compositeNode.performLayout(true);
207
+ compositeNode.container.setActiveChild(newNode.container);
208
+ compositeNode.container.resize(referenceNodeWidth, referenceNodeHeight);
209
+ referenceParent.container.resize(referenceNodeParentWidth, referenceNodeParentHeight);
210
+ }
211
+ else {
212
+ // Add as a sibling, since the parent of the reference node is of the right composite type
213
+ referenceParent = referenceNode.parent;
214
+ if (insertBeforeReference)
215
+ referenceParent.addChildBefore(referenceNode, newNode);
216
+ else
217
+ referenceParent.addChildAfter(referenceNode, newNode);
218
+ referenceParent.performLayout(false);
219
+ referenceParent.container.setActiveChild(newNode.container);
220
+ }
221
+ // force resize the panel
222
+ const containerWidth = newNode.container.containerElement.clientWidth;
223
+ const containerHeight = newNode.container.containerElement.clientHeight;
224
+ newNode.container.resize(containerWidth, containerHeight);
225
+ this.dockManager.invalidate();
226
+ this.dockManager.notifyOnDock(newNode);
227
+ }
228
+ _forceResizeCompositeContainer = (container) => {
229
+ const width = container.containerElement.clientWidth;
230
+ const height = container.containerElement.clientHeight;
231
+ container.resize(width, height);
232
+ };
233
+ _createDockContainer(containerType, newNode, referenceNode) {
234
+ if (containerType === 'horizontal')
235
+ return new HorizontalDockContainer(this.dockManager, [newNode.container, referenceNode.container]);
236
+ if (containerType === 'vertical')
237
+ return new VerticalDockContainer(this.dockManager, [newNode.container, referenceNode.container]);
238
+ if (containerType === 'fill')
239
+ return new FillDockContainer(this.dockManager);
240
+ throw new Error('Failed to create dock container of type: ' + containerType);
241
+ }
242
+ /**
243
+ * Gets the bounds of the new node if it were to dock with the specified configuration
244
+ * The state is not modified in this function. It is used for showing a preview of where
245
+ * the panel would be docked when hovered over a dock wheel button
246
+ */
247
+ getDockBounds(referenceNode, containerToDock, direction, insertBeforeReference) {
248
+ let compositeNode; // The node that contains the splitter / fill node
249
+ let childCount;
250
+ let childPosition;
251
+ let bounds;
252
+ if (direction === 'fill') {
253
+ // Since this is a fill operation, the highlight bounds is the same as the reference node
254
+ // TODO: Create a tab handle highlight to show that it's going to be docked in a tab
255
+ const targetElement = referenceNode.container.containerElement;
256
+ const outerRect = this.dockManager.element.getBoundingClientRect();
257
+ const targetElementRect = targetElement.getBoundingClientRect();
258
+ return { x: targetElementRect.left - outerRect.left, y: targetElementRect.top - outerRect.top, width: targetElement.clientWidth, height: targetElement.clientHeight };
259
+ }
260
+ if (referenceNode.parent && referenceNode.parent.container.containerType === 'fill')
261
+ // Ignore the fill container's child and move one level up
262
+ referenceNode = referenceNode.parent;
263
+ // Flag to indicate of the renference node was replaced with a new composite node with 2 children
264
+ let hierarchyModified = false;
265
+ if (referenceNode.parent && referenceNode.parent.container.containerType === direction) {
266
+ // The parent already is of the desired composite type. Will be inserted as sibling to the reference node
267
+ compositeNode = referenceNode.parent;
268
+ childCount = compositeNode.children.length;
269
+ childPosition = compositeNode.children.indexOf(referenceNode) + (insertBeforeReference ? 0 : 1);
270
+ }
271
+ else {
272
+ // The reference node will be replaced with a new composite node of the desired type with 2 children
273
+ compositeNode = referenceNode;
274
+ childCount = 1; // The newly inserted composite node will contain the reference node
275
+ childPosition = (insertBeforeReference ? 0 : 1);
276
+ hierarchyModified = true;
277
+ }
278
+ const splitBarSize = 5; // TODO: Get from DOM
279
+ let targetPanelSize = 0;
280
+ let targetPanelStart = 0;
281
+ if (direction === 'vertical' || direction === 'horizontal') {
282
+ // Existing size of the composite container (without the splitter bars).
283
+ // This will also be the final size of the composite (splitter / fill)
284
+ // container after the new panel has been docked
285
+ const compositeSize = this._getVaringDimension(compositeNode.container, direction) - (childCount - 1) * splitBarSize;
286
+ // size of the newly added panel
287
+ const newPanelOriginalSize = this._getVaringDimension(containerToDock, direction);
288
+ const scaleMultiplier = compositeSize / (compositeSize + newPanelOriginalSize);
289
+ // Size of the panel after it has been docked and scaled
290
+ targetPanelSize = newPanelOriginalSize * scaleMultiplier;
291
+ if (hierarchyModified)
292
+ targetPanelStart = insertBeforeReference ? 0 : compositeSize * scaleMultiplier;
293
+ else {
294
+ for (let i = 0; i < childPosition; i++)
295
+ targetPanelStart += this._getVaringDimension(compositeNode.children[i].container, direction);
296
+ targetPanelStart *= scaleMultiplier;
297
+ }
298
+ }
299
+ bounds = {};
300
+ const outerRect = this.dockManager.element.getBoundingClientRect();
301
+ const rect = compositeNode.container.containerElement.getBoundingClientRect();
302
+ if (direction === 'vertical') {
303
+ bounds.x = rect.left - outerRect.left;
304
+ bounds.y = rect.top - outerRect.top + targetPanelStart;
305
+ bounds.width = compositeNode.container.width;
306
+ bounds.height = targetPanelSize;
307
+ }
308
+ else if (direction === 'horizontal') {
309
+ bounds.x = rect.left - outerRect.left + targetPanelStart;
310
+ bounds.y = rect.top - outerRect.top;
311
+ bounds.width = targetPanelSize;
312
+ bounds.height = compositeNode.container.height;
313
+ }
314
+ return bounds;
315
+ }
316
+ _getVaringDimension(container, direction) {
317
+ if (direction === 'vertical')
318
+ return container.height;
319
+ if (direction === 'horizontal')
320
+ return container.width;
321
+ return 0;
322
+ }
323
+ }
@@ -0,0 +1,155 @@
1
+ import { DockWheel } from './DockWheel.js';
2
+ import { Point } from './Point.js';
3
+ import { DockManagerContext } from './DockManagerContext.js';
4
+ import { DockNode } from './DockNode.js';
5
+ import { DockLayoutEngine } from './DockLayoutEngine.js';
6
+ import { EventHandler } from './EventHandler.js';
7
+ import { Dialog } from './Dialog.js';
8
+ import { IDockContainer } from './interfaces/IDockContainer.js';
9
+ import { TabPage } from './TabPage.js';
10
+ import { PanelContainer } from './PanelContainer.js';
11
+ import { ILayoutEventListener } from './interfaces/ILayoutEventListener.js';
12
+ import { DockModel } from './DockModel.js';
13
+ import { DockConfig } from './DockConfig.js';
14
+ import { IState } from './interfaces/IState.js';
15
+ /**
16
+ * Dock manager manages all the dock panels in a hierarchy, similar to visual studio.
17
+ * It owns a Html Div element inside which all panels are docked
18
+ * Initially the document manager takes up the central space and acts as the root node
19
+ */
20
+ export declare class DockManager {
21
+ element: HTMLElement;
22
+ context: DockManagerContext;
23
+ dockWheel: DockWheel;
24
+ layoutEngine: DockLayoutEngine;
25
+ mouseMoveHandler: EventHandler;
26
+ touchMoveHandler: EventHandler;
27
+ layoutEventListeners: ILayoutEventListener[];
28
+ closePanelContainerCallback: (panelContainer: PanelContainer) => Promise<boolean>;
29
+ defaultDialogPosition: Point;
30
+ backgroundContext: HTMLElement;
31
+ zIndexCounter: number;
32
+ zIndexTabHost: number;
33
+ zIndexTabHandle: number;
34
+ zIndexDialogCounter: number;
35
+ onKeyPressBound: any;
36
+ iframes: HTMLIFrameElement[];
37
+ _undockEnabled: boolean;
38
+ getElementCallback: (state: IState) => Promise<{
39
+ element: HTMLElement;
40
+ title: string;
41
+ }>;
42
+ private _config;
43
+ private _activePanel;
44
+ private _lastPanelNotADialog;
45
+ private _activeDocument;
46
+ constructor(element: HTMLElement, config?: DockConfig);
47
+ get config(): DockConfig;
48
+ initialize(): void;
49
+ onKeyPress(e: KeyboardEvent): void;
50
+ checkXBounds(container: HTMLElement, currentMousePosition: Point, previousMousePosition: Point, resizeWest: boolean, resizeEast: boolean): number;
51
+ checkXBoundsWithinDockContainer(container: HTMLElement, currentMousePosition: Point, previousMousePosition: Point, resizeWest: boolean, resizeEast: boolean): number;
52
+ checkYBounds(container: HTMLElement, currentMousePosition: Point, previousMousePosition: Point, resizeNorth: boolean, resizeSouth: boolean): number;
53
+ checkYBoundsWithinDockContainer(container: HTMLElement, currentMousePosition: Point, previousMousePosition: Point, resizeNorth: boolean, resizeSouth: boolean): number;
54
+ rebuildLayout(node: DockNode): void;
55
+ invalidate(): void;
56
+ resize(width: number, height: number): void;
57
+ /**
58
+ * Reset the dock model . This happens when the state is loaded from json
59
+ */
60
+ setModel(model: DockModel): void;
61
+ loadResize(node: DockNode): void;
62
+ setRootNode(node: DockNode): void;
63
+ _onDialogDragStarted(sender: Dialog, e: any): void;
64
+ _onDialogDragEnded(sender: Dialog, e: any): void;
65
+ private _onMouseMoved;
66
+ /**
67
+ * Perform a DFS (DeepFirstSearch) on the dock model's tree to find the
68
+ * deepest level panel (i.e. the top-most non-overlapping panel)
69
+ * that is under the mouse cursor
70
+ * Retuns null if no node is found under this point
71
+ */
72
+ private _findNodeOnPoint;
73
+ /** Dock the [dialog] to the left of the [referenceNode] node */
74
+ dockDialogLeft(referenceNode: DockNode, dialog: Dialog): DockNode;
75
+ /** Dock the [dialog] to the right of the [referenceNode] node */
76
+ dockDialogRight(referenceNode: DockNode, dialog: Dialog): DockNode;
77
+ /** Dock the [dialog] above the [referenceNode] node */
78
+ dockDialogUp(referenceNode: DockNode, dialog: Dialog): DockNode;
79
+ /** Dock the [dialog] below the [referenceNode] node */
80
+ dockDialogDown(referenceNode: DockNode, dialog: Dialog): DockNode;
81
+ /** Dock the [dialog] as a tab inside the [referenceNode] node */
82
+ dockDialogFill(referenceNode: DockNode, dialog: Dialog): DockNode;
83
+ /** Dock the [container] to the left of the [referenceNode] node */
84
+ dockLeft(referenceNode: DockNode, container: PanelContainer, ratio: number): DockNode;
85
+ /** Dock the [container] to the right of the [referenceNode] node */
86
+ dockRight(referenceNode: DockNode, container: PanelContainer, ratio: number): DockNode;
87
+ /** Dock the [container] above the [referenceNode] node */
88
+ dockUp(referenceNode: DockNode, container: PanelContainer, ratio: number): DockNode;
89
+ /** Dock the [container] below the [referenceNode] node */
90
+ dockDown(referenceNode: DockNode, container: PanelContainer, ratio: number): DockNode;
91
+ /** Dock the [container] as a tab inside the [referenceNode] node */
92
+ dockFill(referenceNode: DockNode, container: PanelContainer): DockNode;
93
+ floatDialog(container: PanelContainer, x: number, y: number, grayoutParent?: PanelContainer, disableResize?: boolean): Dialog;
94
+ private _requestDockDialog;
95
+ private _checkShowBackgroundContext;
96
+ private _requestDockContainer;
97
+ _requestTabReorder(container: IDockContainer, e: any): void;
98
+ /**
99
+ * Undocks a panel and converts it into a floating dialog window
100
+ * It is assumed that only leaf nodes (panels) can be undocked
101
+ */
102
+ requestUndockToDialog(container: PanelContainer, event: any, dragOffset: Point): Dialog;
103
+ /**
104
+ * closes a Panel
105
+ */
106
+ requestClose(container: PanelContainer): void;
107
+ /**
108
+ * Opens a Element in a Dialog
109
+ * It is assumed that only leaf nodes (panels) can be undocked
110
+ */
111
+ openInDialog(container: PanelContainer, event: any, dragOffset: Point, disableResize?: boolean): Dialog;
112
+ /** Undocks a panel and converts it into a floating dialog window
113
+ * It is assumed that only leaf nodes (panels) can be undocked
114
+ */
115
+ requestUndock(container: PanelContainer): void;
116
+ /**
117
+ * Removes a dock container from the dock layout hierarcy
118
+ * Returns the node that was removed from the dock tree
119
+ */
120
+ requestRemove(container: PanelContainer): DockNode;
121
+ getNodeByElementId(id: string): DockNode;
122
+ getNodeByElement(element: Element): DockNode;
123
+ /** Finds the node that owns the specified [container] */
124
+ private _findNodeFromContainer;
125
+ findNodeFromContainerElement(containerElement: HTMLElement): DockNode;
126
+ addLayoutListener(listener: ILayoutEventListener): void;
127
+ removeLayoutListener(listener: ILayoutEventListener): void;
128
+ suspendLayout(panel: IDockContainer): void;
129
+ resumeLayout(panel: IDockContainer): void;
130
+ notifyOnDock(dockNode: DockNode): void;
131
+ notifyOnTabsReorder(dockNode: DockNode): void;
132
+ notifyOnUnDock(dockNode: DockNode): void;
133
+ notifyOnClosePanel(panel: PanelContainer): void;
134
+ notifyOnCreateDialog(dialog: Dialog): void;
135
+ notifyOnHideDialog(dialog: Dialog): void;
136
+ notifyOnShowDialog(dialog: Dialog): void;
137
+ notifyOnChangeDialogPosition(dialog: Dialog, x: number, y: number): void;
138
+ notifyOnContainerResized(dockContainer: IDockContainer): void;
139
+ notifyOnTabChange(tabpage: TabPage): void;
140
+ notifyOnActivePanelChange(panel: PanelContainer, oldActive: PanelContainer): void;
141
+ notifyOnActiveDocumentChange(panel: PanelContainer, oldActive: PanelContainer): void;
142
+ saveState(): string;
143
+ loadState(json: string): Promise<void>;
144
+ getPanels(): PanelContainer[];
145
+ undockEnabled(state: boolean): void;
146
+ lockDockState(state: boolean): void;
147
+ hideCloseButton(state: boolean): void;
148
+ updatePanels(ids: string[]): PanelContainer[];
149
+ getVisiblePanels(): PanelContainer[];
150
+ _allPanels(node: DockNode, panels: PanelContainer[]): void;
151
+ get activeDocument(): PanelContainer;
152
+ get activePanel(): PanelContainer;
153
+ set activePanel(value: PanelContainer);
154
+ }
155
+ //# sourceMappingURL=DockManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DockManager.d.ts","sourceRoot":"","sources":["../src/DockManager.ts"],"names":[],"mappings":"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"}