flexlayout-react 0.8.12 → 0.8.13

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 (307) hide show
  1. package/README.md +16 -5
  2. package/declarations/Attribute.d.ts +25 -1
  3. package/declarations/AttributeDefinitions.d.ts +18 -1
  4. package/declarations/DockLocation.d.ts +22 -0
  5. package/declarations/I18nLabel.d.ts +2 -1
  6. package/declarations/Orientation.d.ts +4 -0
  7. package/declarations/Rect.d.ts +3 -0
  8. package/declarations/index.d.ts +1 -0
  9. package/declarations/model/BorderNode.d.ts +53 -0
  10. package/declarations/model/BorderSet.d.ts +28 -0
  11. package/declarations/model/IDraggable.d.ts +4 -0
  12. package/declarations/model/IDropTarget.d.ts +10 -0
  13. package/declarations/model/LayoutWindow.d.ts +16 -0
  14. package/declarations/model/Model.d.ts +55 -0
  15. package/declarations/model/Node.d.ts +61 -0
  16. package/declarations/model/RowNode.d.ts +67 -0
  17. package/declarations/model/TabNode.d.ts +79 -0
  18. package/declarations/model/TabSetNode.d.ts +60 -0
  19. package/declarations/model/Utils.d.ts +8 -0
  20. package/declarations/view/BorderButton.d.ts +13 -1
  21. package/declarations/view/BorderTab.d.ts +8 -0
  22. package/declarations/view/BorderTabSet.d.ts +10 -1
  23. package/declarations/view/DragContainer.d.ts +9 -1
  24. package/declarations/view/ErrorBoundary.d.ts +22 -1
  25. package/declarations/view/Icons.d.ts +1 -0
  26. package/declarations/view/Layout.d.ts +143 -1
  27. package/declarations/view/Overlay.d.ts +8 -1
  28. package/declarations/view/PopoutWindow.d.ts +14 -1
  29. package/declarations/view/PopupMenu.d.ts +12 -1
  30. package/declarations/view/Row.d.ts +9 -1
  31. package/declarations/view/Splitter.d.ts +14 -1
  32. package/declarations/view/Tab.d.ts +11 -1
  33. package/declarations/view/TabButton.d.ts +11 -1
  34. package/declarations/view/TabButtonStamp.d.ts +9 -1
  35. package/declarations/view/TabOverflowHook.d.ts +16 -1
  36. package/declarations/view/TabSet.d.ts +9 -1
  37. package/declarations/view/Utils.d.ts +13 -0
  38. package/lib/index.js +6410 -22
  39. package/package.json +34 -26
  40. package/ChangeLog.txt +0 -372
  41. package/declarations/DragDrop.d.ts +0 -15
  42. package/declarations/PopupMenu.d.ts +0 -1
  43. package/declarations/model/SplitterNode.d.ts +0 -5
  44. package/declarations/model/WindowLayout.d.ts +0 -24
  45. package/declarations/src/Attribute.d.ts +0 -1
  46. package/declarations/src/AttributeDefinitions.d.ts +0 -1
  47. package/declarations/src/DockLocation.d.ts +0 -12
  48. package/declarations/src/DropInfo.d.ts +0 -12
  49. package/declarations/src/I18nLabel.d.ts +0 -10
  50. package/declarations/src/Orientation.d.ts +0 -7
  51. package/declarations/src/PopupMenu.d.ts +0 -1
  52. package/declarations/src/Rect.d.ts +0 -31
  53. package/declarations/src/Types.d.ts +0 -92
  54. package/declarations/src/index.d.ts +0 -20
  55. package/declarations/src/model/Action.d.ts +0 -5
  56. package/declarations/src/model/Actions.d.ts +0 -110
  57. package/declarations/src/model/BorderNode.d.ts +0 -28
  58. package/declarations/src/model/BorderSet.d.ts +0 -3
  59. package/declarations/src/model/ICloseType.d.ts +0 -5
  60. package/declarations/src/model/IDraggable.d.ts +0 -2
  61. package/declarations/src/model/IDropTarget.d.ts +0 -2
  62. package/declarations/src/model/IJsonModel.d.ts +0 -153
  63. package/declarations/src/model/Model.d.ts +0 -98
  64. package/declarations/src/model/Node.d.ts +0 -16
  65. package/declarations/src/model/RowNode.d.ts +0 -11
  66. package/declarations/src/model/TabNode.d.ts +0 -36
  67. package/declarations/src/model/TabSetNode.d.ts +0 -37
  68. package/declarations/src/model/Utils.d.ts +0 -1
  69. package/declarations/src/view/BorderButton.d.ts +0 -1
  70. package/declarations/src/view/BorderTab.d.ts +0 -2
  71. package/declarations/src/view/BorderTabSet.d.ts +0 -1
  72. package/declarations/src/view/DragContainer.d.ts +0 -1
  73. package/declarations/src/view/ErrorBoundary.d.ts +0 -1
  74. package/declarations/src/view/FloatingWindow.d.ts +0 -1
  75. package/declarations/src/view/Icons.d.ts +0 -7
  76. package/declarations/src/view/Layout.d.ts +0 -113
  77. package/declarations/src/view/Overlay.d.ts +0 -1
  78. package/declarations/src/view/PopupMenu.d.ts +0 -1
  79. package/declarations/src/view/Row.d.ts +0 -1
  80. package/declarations/src/view/Splitter.d.ts +0 -1
  81. package/declarations/src/view/Tab.d.ts +0 -1
  82. package/declarations/src/view/TabButton.d.ts +0 -1
  83. package/declarations/src/view/TabButtonStamp.d.ts +0 -1
  84. package/declarations/src/view/TabOverflowHook.d.ts +0 -1
  85. package/declarations/src/view/TabSet.d.ts +0 -1
  86. package/declarations/src/view/Utils.d.ts +0 -4
  87. package/declarations/view/ExtendedResizeObserver.d.ts +0 -23
  88. package/declarations/view/FloatingWindow.d.ts +0 -1
  89. package/declarations/view/FloatingWindowTab.d.ts +0 -1
  90. package/declarations/view/TabFloating.d.ts +0 -1
  91. package/dist/flexlayout.js +0 -610
  92. package/dist/flexlayout_min.js +0 -2
  93. package/dist/flexlayout_min.js.LICENSE.txt +0 -29
  94. package/dist/src/Attribute.js +0 -43
  95. package/dist/src/Attribute.js.map +0 -1
  96. package/dist/src/AttributeDefinitions.js +0 -132
  97. package/dist/src/AttributeDefinitions.js.map +0 -1
  98. package/dist/src/DockLocation.js +0 -121
  99. package/dist/src/DockLocation.js.map +0 -1
  100. package/dist/src/DropInfo.js +0 -10
  101. package/dist/src/DropInfo.js.map +0 -1
  102. package/dist/src/I18nLabel.js +0 -14
  103. package/dist/src/I18nLabel.js.map +0 -1
  104. package/dist/src/Orientation.js +0 -23
  105. package/dist/src/Orientation.js.map +0 -1
  106. package/dist/src/Rect.js +0 -111
  107. package/dist/src/Rect.js.map +0 -1
  108. package/dist/src/Types.js +0 -95
  109. package/dist/src/Types.js.map +0 -1
  110. package/dist/src/index.js +0 -22
  111. package/dist/src/index.js.map +0 -1
  112. package/dist/src/model/Action.js +0 -7
  113. package/dist/src/model/Action.js.map +0 -1
  114. package/dist/src/model/Actions.js +0 -170
  115. package/dist/src/model/Actions.js.map +0 -1
  116. package/dist/src/model/BorderNode.js +0 -390
  117. package/dist/src/model/BorderNode.js.map +0 -1
  118. package/dist/src/model/BorderSet.js +0 -67
  119. package/dist/src/model/BorderSet.js.map +0 -1
  120. package/dist/src/model/ICloseType.js +0 -7
  121. package/dist/src/model/ICloseType.js.map +0 -1
  122. package/dist/src/model/IDraggable.js +0 -2
  123. package/dist/src/model/IDraggable.js.map +0 -1
  124. package/dist/src/model/IDropTarget.js +0 -2
  125. package/dist/src/model/IDropTarget.js.map +0 -1
  126. package/dist/src/model/IJsonModel.js +0 -2
  127. package/dist/src/model/IJsonModel.js.map +0 -1
  128. package/dist/src/model/LayoutWindow.js +0 -81
  129. package/dist/src/model/LayoutWindow.js.map +0 -1
  130. package/dist/src/model/Model.js +0 -608
  131. package/dist/src/model/Model.js.map +0 -1
  132. package/dist/src/model/Node.js +0 -218
  133. package/dist/src/model/Node.js.map +0 -1
  134. package/dist/src/model/RowNode.js +0 -492
  135. package/dist/src/model/RowNode.js.map +0 -1
  136. package/dist/src/model/TabNode.js +0 -293
  137. package/dist/src/model/TabNode.js.map +0 -1
  138. package/dist/src/model/TabSetNode.js +0 -469
  139. package/dist/src/model/TabSetNode.js.map +0 -1
  140. package/dist/src/model/Utils.js +0 -48
  141. package/dist/src/model/Utils.js.map +0 -1
  142. package/dist/src/view/BorderButton.js +0 -126
  143. package/dist/src/view/BorderButton.js.map +0 -1
  144. package/dist/src/view/BorderTab.js +0 -44
  145. package/dist/src/view/BorderTab.js.map +0 -1
  146. package/dist/src/view/BorderTabSet.js +0 -138
  147. package/dist/src/view/BorderTabSet.js.map +0 -1
  148. package/dist/src/view/DragContainer.js +0 -16
  149. package/dist/src/view/DragContainer.js.map +0 -1
  150. package/dist/src/view/ErrorBoundary.js +0 -24
  151. package/dist/src/view/ErrorBoundary.js.map +0 -1
  152. package/dist/src/view/Icons.js +0 -29
  153. package/dist/src/view/Icons.js.map +0 -1
  154. package/dist/src/view/Layout.js +0 -881
  155. package/dist/src/view/Layout.js.map +0 -1
  156. package/dist/src/view/Overlay.js +0 -9
  157. package/dist/src/view/Overlay.js.map +0 -1
  158. package/dist/src/view/PopoutWindow.js +0 -129
  159. package/dist/src/view/PopoutWindow.js.map +0 -1
  160. package/dist/src/view/PopupMenu.js +0 -89
  161. package/dist/src/view/PopupMenu.js.map +0 -1
  162. package/dist/src/view/Row.js +0 -46
  163. package/dist/src/view/Row.js.map +0 -1
  164. package/dist/src/view/SizeTracker.js +0 -12
  165. package/dist/src/view/SizeTracker.js.map +0 -1
  166. package/dist/src/view/Splitter.js +0 -192
  167. package/dist/src/view/Splitter.js.map +0 -1
  168. package/dist/src/view/Tab.js +0 -91
  169. package/dist/src/view/Tab.js.map +0 -1
  170. package/dist/src/view/TabButton.js +0 -124
  171. package/dist/src/view/TabButton.js.map +0 -1
  172. package/dist/src/view/TabButtonStamp.js +0 -15
  173. package/dist/src/view/TabButtonStamp.js.map +0 -1
  174. package/dist/src/view/TabOverflowHook.js +0 -266
  175. package/dist/src/view/TabOverflowHook.js.map +0 -1
  176. package/dist/src/view/TabSet.js +0 -256
  177. package/dist/src/view/TabSet.js.map +0 -1
  178. package/dist/src/view/Utils.js +0 -110
  179. package/dist/src/view/Utils.js.map +0 -1
  180. package/lib/Attribute.js +0 -43
  181. package/lib/Attribute.js.map +0 -1
  182. package/lib/AttributeDefinitions.js +0 -132
  183. package/lib/AttributeDefinitions.js.map +0 -1
  184. package/lib/DockLocation.js +0 -121
  185. package/lib/DockLocation.js.map +0 -1
  186. package/lib/DropInfo.js +0 -10
  187. package/lib/DropInfo.js.map +0 -1
  188. package/lib/I18nLabel.js +0 -14
  189. package/lib/I18nLabel.js.map +0 -1
  190. package/lib/Orientation.js +0 -23
  191. package/lib/Orientation.js.map +0 -1
  192. package/lib/Rect.js +0 -111
  193. package/lib/Rect.js.map +0 -1
  194. package/lib/Types.js +0 -95
  195. package/lib/Types.js.map +0 -1
  196. package/lib/index.js.map +0 -1
  197. package/lib/model/Action.js +0 -7
  198. package/lib/model/Action.js.map +0 -1
  199. package/lib/model/Actions.js +0 -170
  200. package/lib/model/Actions.js.map +0 -1
  201. package/lib/model/BorderNode.js +0 -390
  202. package/lib/model/BorderNode.js.map +0 -1
  203. package/lib/model/BorderSet.js +0 -67
  204. package/lib/model/BorderSet.js.map +0 -1
  205. package/lib/model/ICloseType.js +0 -7
  206. package/lib/model/ICloseType.js.map +0 -1
  207. package/lib/model/IDraggable.js +0 -2
  208. package/lib/model/IDraggable.js.map +0 -1
  209. package/lib/model/IDropTarget.js +0 -2
  210. package/lib/model/IDropTarget.js.map +0 -1
  211. package/lib/model/IJsonModel.js +0 -2
  212. package/lib/model/IJsonModel.js.map +0 -1
  213. package/lib/model/LayoutWindow.js +0 -81
  214. package/lib/model/LayoutWindow.js.map +0 -1
  215. package/lib/model/Model.js +0 -608
  216. package/lib/model/Model.js.map +0 -1
  217. package/lib/model/Node.js +0 -218
  218. package/lib/model/Node.js.map +0 -1
  219. package/lib/model/RowNode.js +0 -492
  220. package/lib/model/RowNode.js.map +0 -1
  221. package/lib/model/TabNode.js +0 -293
  222. package/lib/model/TabNode.js.map +0 -1
  223. package/lib/model/TabSetNode.js +0 -469
  224. package/lib/model/TabSetNode.js.map +0 -1
  225. package/lib/model/Utils.js +0 -48
  226. package/lib/model/Utils.js.map +0 -1
  227. package/lib/view/BorderButton.js +0 -126
  228. package/lib/view/BorderButton.js.map +0 -1
  229. package/lib/view/BorderTab.js +0 -56
  230. package/lib/view/BorderTab.js.map +0 -1
  231. package/lib/view/BorderTabSet.js +0 -138
  232. package/lib/view/BorderTabSet.js.map +0 -1
  233. package/lib/view/DragContainer.js +0 -16
  234. package/lib/view/DragContainer.js.map +0 -1
  235. package/lib/view/ErrorBoundary.js +0 -24
  236. package/lib/view/ErrorBoundary.js.map +0 -1
  237. package/lib/view/Icons.js +0 -29
  238. package/lib/view/Icons.js.map +0 -1
  239. package/lib/view/Layout.js +0 -881
  240. package/lib/view/Layout.js.map +0 -1
  241. package/lib/view/Overlay.js +0 -9
  242. package/lib/view/Overlay.js.map +0 -1
  243. package/lib/view/PopoutWindow.js +0 -129
  244. package/lib/view/PopoutWindow.js.map +0 -1
  245. package/lib/view/PopupMenu.js +0 -89
  246. package/lib/view/PopupMenu.js.map +0 -1
  247. package/lib/view/Row.js +0 -46
  248. package/lib/view/Row.js.map +0 -1
  249. package/lib/view/SizeTracker.js +0 -12
  250. package/lib/view/SizeTracker.js.map +0 -1
  251. package/lib/view/Splitter.js +0 -197
  252. package/lib/view/Splitter.js.map +0 -1
  253. package/lib/view/Tab.js +0 -91
  254. package/lib/view/Tab.js.map +0 -1
  255. package/lib/view/TabButton.js +0 -124
  256. package/lib/view/TabButton.js.map +0 -1
  257. package/lib/view/TabButtonStamp.js +0 -15
  258. package/lib/view/TabButtonStamp.js.map +0 -1
  259. package/lib/view/TabOverflowHook.js +0 -266
  260. package/lib/view/TabOverflowHook.js.map +0 -1
  261. package/lib/view/TabSet.js +0 -269
  262. package/lib/view/TabSet.js.map +0 -1
  263. package/lib/view/Utils.js +0 -110
  264. package/lib/view/Utils.js.map +0 -1
  265. package/src/Attribute.ts +0 -64
  266. package/src/AttributeDefinitions.ts +0 -144
  267. package/src/DockLocation.ts +0 -133
  268. package/src/DropInfo.ts +0 -20
  269. package/src/I18nLabel.ts +0 -12
  270. package/src/Orientation.ts +0 -28
  271. package/src/Rect.ts +0 -147
  272. package/src/Types.ts +0 -112
  273. package/src/index.ts +0 -23
  274. package/src/model/Action.ts +0 -9
  275. package/src/model/Actions.ts +0 -188
  276. package/src/model/BorderNode.ts +0 -458
  277. package/src/model/BorderSet.ts +0 -87
  278. package/src/model/ICloseType.ts +0 -5
  279. package/src/model/IDraggable.ts +0 -7
  280. package/src/model/IDropTarget.ts +0 -14
  281. package/src/model/IJsonModel.ts +0 -967
  282. package/src/model/LayoutWindow.ts +0 -119
  283. package/src/model/Model.ts +0 -704
  284. package/src/model/Node.ts +0 -280
  285. package/src/model/RowNode.ts +0 -559
  286. package/src/model/TabNode.ts +0 -424
  287. package/src/model/TabSetNode.ts +0 -592
  288. package/src/model/Utils.ts +0 -52
  289. package/src/view/BorderButton.tsx +0 -201
  290. package/src/view/BorderTab.tsx +0 -81
  291. package/src/view/BorderTabSet.tsx +0 -259
  292. package/src/view/DragContainer.tsx +0 -32
  293. package/src/view/ErrorBoundary.tsx +0 -42
  294. package/src/view/Icons.tsx +0 -57
  295. package/src/view/Layout.tsx +0 -1334
  296. package/src/view/Overlay.tsx +0 -21
  297. package/src/view/PopoutWindow.tsx +0 -152
  298. package/src/view/PopupMenu.tsx +0 -156
  299. package/src/view/Row.tsx +0 -68
  300. package/src/view/SizeTracker.tsx +0 -20
  301. package/src/view/Splitter.tsx +0 -262
  302. package/src/view/Tab.tsx +0 -128
  303. package/src/view/TabButton.tsx +0 -200
  304. package/src/view/TabButtonStamp.tsx +0 -42
  305. package/src/view/TabOverflowHook.tsx +0 -305
  306. package/src/view/TabSet.tsx +0 -475
  307. package/src/view/Utils.tsx +0 -135
@@ -1,704 +0,0 @@
1
- import { Attribute } from "../Attribute";
2
- import { AttributeDefinitions } from "../AttributeDefinitions";
3
- import { DockLocation } from "../DockLocation";
4
- import { DropInfo } from "../DropInfo";
5
- import { Rect } from "../Rect";
6
- import { Action } from "./Action";
7
- import { Actions } from "./Actions";
8
- import { BorderNode } from "./BorderNode";
9
- import { BorderSet } from "./BorderSet";
10
- import { IDraggable } from "./IDraggable";
11
- import { IDropTarget } from "./IDropTarget";
12
- import { IJsonModel, IJsonPopout, ITabSetAttributes } from "./IJsonModel";
13
- import { Node } from "./Node";
14
- import { RowNode } from "./RowNode";
15
- import { TabNode } from "./TabNode";
16
- import { TabSetNode } from "./TabSetNode";
17
- import { randomUUID } from "./Utils";
18
- import { LayoutWindow } from "./LayoutWindow";
19
-
20
- /** @internal */
21
- export const DefaultMin = 0;
22
- /** @internal */
23
- export const DefaultMax = 99999;
24
-
25
- /**
26
- * Class containing the Tree of Nodes used by the FlexLayout component
27
- */
28
- export class Model {
29
- static MAIN_WINDOW_ID = "__main_window_id__";
30
-
31
- /** @internal */
32
- private static attributeDefinitions: AttributeDefinitions = Model.createAttributeDefinitions();
33
-
34
- /** @internal */
35
- private attributes: Record<string, any>;
36
- /** @internal */
37
- private idMap: Map<string, Node>;
38
- /** @internal */
39
- private changeListeners: ((action: Action) => void)[];
40
- /** @internal */
41
- private borders: BorderSet;
42
- /** @internal */
43
- private onAllowDrop?: (dragNode: Node, dropInfo: DropInfo) => boolean;
44
- /** @internal */
45
- private onCreateTabSet?: (tabNode?: TabNode) => ITabSetAttributes;
46
- /** @internal */
47
- private windows: Map<string, LayoutWindow>;
48
- /** @internal */
49
- private rootWindow: LayoutWindow;
50
-
51
- /**
52
- * 'private' constructor. Use the static method Model.fromJson(json) to create a model
53
- * @internal
54
- */
55
- protected constructor() {
56
- this.attributes = {};
57
- this.idMap = new Map();
58
- this.borders = new BorderSet(this);
59
- this.windows = new Map<string, LayoutWindow>();
60
- this.rootWindow = new LayoutWindow(Model.MAIN_WINDOW_ID, Rect.empty());
61
- this.windows.set(Model.MAIN_WINDOW_ID, this.rootWindow);
62
- this.changeListeners = [];
63
- }
64
-
65
- /**
66
- * Update the node tree by performing the given action,
67
- * Actions should be generated via static methods on the Actions class
68
- * @param action the action to perform
69
- * @returns added Node for Actions.addNode, windowId for createWindow
70
- */
71
- doAction(action: Action): any {
72
- let returnVal = undefined;
73
- // console.log(action);
74
- switch (action.type) {
75
- case Actions.ADD_NODE: {
76
- const newNode = new TabNode(this, action.data.json, true);
77
- const toNode = this.idMap.get(action.data.toNode) as Node & IDraggable;
78
- if (toNode instanceof TabSetNode || toNode instanceof BorderNode || toNode instanceof RowNode) {
79
- toNode.drop(newNode, DockLocation.getByName(action.data.location), action.data.index, action.data.select);
80
- returnVal = newNode;
81
- }
82
- break;
83
- }
84
- case Actions.MOVE_NODE: {
85
- const fromNode = this.idMap.get(action.data.fromNode) as Node & IDraggable;
86
-
87
- if (fromNode instanceof TabNode || fromNode instanceof TabSetNode || fromNode instanceof RowNode) {
88
- if (fromNode === this.getMaximizedTabset(fromNode.getWindowId())) {
89
- const fromWindow = this.windows.get(fromNode.getWindowId())!;
90
- fromWindow.maximizedTabSet = undefined;
91
- }
92
- const toNode = this.idMap.get(action.data.toNode) as Node & IDropTarget;
93
- if (toNode instanceof TabSetNode || toNode instanceof BorderNode || toNode instanceof RowNode) {
94
- toNode.drop(fromNode, DockLocation.getByName(action.data.location), action.data.index, action.data.select);
95
- }
96
- }
97
- this.removeEmptyWindows();
98
- break;
99
- }
100
- case Actions.DELETE_TAB: {
101
- const node = this.idMap.get(action.data.node);
102
- if (node instanceof TabNode) {
103
- node.delete();
104
- }
105
- this.removeEmptyWindows();
106
- break;
107
- }
108
- case Actions.DELETE_TABSET: {
109
- const node = this.idMap.get(action.data.node);
110
-
111
- if (node instanceof TabSetNode) {
112
- // first delete all child tabs that are closeable
113
- const children = [...node.getChildren()];
114
- for (let i = 0; i < children.length; i++) {
115
- const child = children[i];
116
- if ((child as TabNode).isEnableClose()) {
117
- (child as TabNode).delete();
118
- }
119
- }
120
-
121
- if (node.getChildren().length === 0) {
122
- node.delete();
123
- }
124
- this.tidy();
125
- }
126
- this.removeEmptyWindows();
127
- break;
128
- }
129
- case Actions.POPOUT_TABSET: {
130
- const node = this.idMap.get(action.data.node);
131
- if (node instanceof TabSetNode) {
132
- const isMaximized = node.isMaximized();
133
- const oldLayoutWindow = this.windows.get(node.getWindowId())!;
134
- const windowId = randomUUID()
135
- const layoutWindow = new LayoutWindow(windowId, oldLayoutWindow.toScreenRectFunction(node.getRect()));
136
- const json = {
137
- type: "row",
138
- children: []
139
- }
140
- const row = RowNode.fromJson(json, this, layoutWindow);
141
- layoutWindow.root = row;
142
- this.windows.set(windowId, layoutWindow);
143
- row.drop(node, DockLocation.CENTER, 0);
144
-
145
- if (isMaximized) {
146
- this.rootWindow.maximizedTabSet = undefined;
147
- }
148
- }
149
- this.removeEmptyWindows();
150
- break;
151
- }
152
- case Actions.POPOUT_TAB: {
153
- const node = this.idMap.get(action.data.node);
154
- if (node instanceof TabNode) {
155
- const windowId = randomUUID()
156
- let r = Rect.empty();
157
- if (node.getParent() instanceof TabSetNode) {
158
- r = node.getParent()!.getRect();
159
- } else {
160
- r = (node.getParent() as BorderNode).getContentRect();
161
- }
162
- const oldLayoutWindow = this.windows.get(node.getWindowId())!;
163
- const layoutWindow = new LayoutWindow(windowId, oldLayoutWindow.toScreenRectFunction(r));
164
- const tabsetId = randomUUID();
165
- const json = {
166
- type: "row",
167
- children: [
168
- { type: "tabset", id: tabsetId }
169
- ]
170
- }
171
- const row = RowNode.fromJson(json, this, layoutWindow);
172
- layoutWindow.root = row;
173
- this.windows.set(windowId, layoutWindow);
174
-
175
- const tabset = this.idMap.get(tabsetId) as TabSetNode & IDropTarget;
176
- tabset.drop(node, DockLocation.CENTER, 0, true);
177
- }
178
- this.removeEmptyWindows();
179
- break;
180
- }
181
- case Actions.CLOSE_WINDOW: {
182
- const window = this.windows.get(action.data.windowId);
183
- if (window) {
184
- this.rootWindow.root?.drop(window?.root!, DockLocation.CENTER, -1);
185
- this.rootWindow.visitNodes((node, level) => {
186
- if (node instanceof RowNode) {
187
- node.setWindowId(Model.MAIN_WINDOW_ID);
188
- }
189
- })
190
-
191
- // this.getFirstTabSet().drop(window?.root!,DockLocation.CENTER, -1);
192
-
193
- this.windows.delete(action.data.windowId);
194
- }
195
- break;
196
- }
197
- case Actions.CREATE_WINDOW: {
198
- const windowId = randomUUID();
199
- const layoutWindow = new LayoutWindow(windowId, Rect.fromJson(action.data.rect));
200
- const row = RowNode.fromJson(action.data.layout, this, layoutWindow);
201
- layoutWindow.root = row;
202
- this.windows.set(windowId, layoutWindow);
203
- returnVal = windowId;
204
- break;
205
- }
206
- case Actions.RENAME_TAB: {
207
- const node = this.idMap.get(action.data.node);
208
- if (node instanceof TabNode) {
209
- node.setName(action.data.text);
210
- }
211
- break;
212
- }
213
- case Actions.SELECT_TAB: {
214
- const tabNode = this.idMap.get(action.data.tabNode);
215
- const windowId = action.data.windowId ? action.data.windowId : Model.MAIN_WINDOW_ID;
216
- const window = this.windows.get(windowId)!;
217
- if (tabNode instanceof TabNode) {
218
- const parent = tabNode.getParent() as Node;
219
- const pos = parent.getChildren().indexOf(tabNode);
220
-
221
- if (parent instanceof BorderNode) {
222
- if (parent.getSelected() === pos) {
223
- parent.setSelected(-1);
224
- } else {
225
- parent.setSelected(pos);
226
- }
227
- } else if (parent instanceof TabSetNode) {
228
- if (parent.getSelected() !== pos) {
229
- parent.setSelected(pos);
230
- }
231
- window.activeTabSet = parent;
232
- }
233
- }
234
- break;
235
- }
236
- case Actions.SET_ACTIVE_TABSET: {
237
- const windowId = action.data.windowId ? action.data.windowId : Model.MAIN_WINDOW_ID;
238
- const window = this.windows.get(windowId)!;
239
- if (action.data.tabsetNode === undefined) {
240
- window.activeTabSet = undefined;
241
- } else {
242
- const tabsetNode = this.idMap.get(action.data.tabsetNode);
243
- if (tabsetNode instanceof TabSetNode) {
244
- window.activeTabSet = tabsetNode;
245
- }
246
- }
247
- break;
248
- }
249
- case Actions.ADJUST_WEIGHTS: {
250
- const row = this.idMap.get(action.data.nodeId) as RowNode;
251
- const c = row.getChildren();
252
- for (let i = 0; i < c.length; i++) {
253
- const n = c[i] as TabSetNode | RowNode;
254
- n.setWeight(action.data.weights[i]);
255
- }
256
- break;
257
- }
258
- case Actions.ADJUST_BORDER_SPLIT: {
259
- const node = this.idMap.get(action.data.node);
260
- if (node instanceof BorderNode) {
261
- node.setSize(action.data.pos);
262
- }
263
- break;
264
- }
265
- case Actions.MAXIMIZE_TOGGLE: {
266
- const windowId = action.data.windowId ? action.data.windowId : Model.MAIN_WINDOW_ID;
267
- const window = this.windows.get(windowId)!;
268
- const node = this.idMap.get(action.data.node);
269
- if (node instanceof TabSetNode) {
270
- if (node === window.maximizedTabSet) {
271
- window.maximizedTabSet = undefined;
272
- } else {
273
- window.maximizedTabSet = node;
274
- window.activeTabSet = node;
275
- }
276
- }
277
-
278
- break;
279
- }
280
- case Actions.UPDATE_MODEL_ATTRIBUTES: {
281
- this.updateAttrs(action.data.json);
282
- break;
283
- }
284
-
285
- case Actions.UPDATE_NODE_ATTRIBUTES: {
286
- const node = this.idMap.get(action.data.node)!;
287
- node.updateAttrs(action.data.json);
288
- break;
289
- }
290
- default:
291
- break;
292
- }
293
-
294
- this.updateIdMap();
295
-
296
- for (const listener of this.changeListeners) {
297
- listener(action);
298
- }
299
-
300
- return returnVal;
301
- }
302
-
303
-
304
-
305
- /**
306
- * Get the currently active tabset node
307
- */
308
- getActiveTabset(windowId: string = Model.MAIN_WINDOW_ID) {
309
- const window = this.windows.get(windowId);
310
- if (window && window.activeTabSet && this.getNodeById(window.activeTabSet.getId())) {
311
- return window.activeTabSet;
312
- } else {
313
- return undefined;
314
- }
315
- }
316
-
317
- /**
318
- * Get the currently maximized tabset node
319
- */
320
- getMaximizedTabset(windowId: string = Model.MAIN_WINDOW_ID) {
321
- return this.windows.get(windowId)!.maximizedTabSet;
322
- }
323
-
324
- /**
325
- * Gets the root RowNode of the model
326
- * @returns {RowNode}
327
- */
328
- getRoot(windowId: string = Model.MAIN_WINDOW_ID) {
329
- return this.windows.get(windowId)!.root!;
330
- }
331
-
332
- isRootOrientationVertical() {
333
- return this.attributes.rootOrientationVertical as boolean;
334
- }
335
-
336
- isEnableRotateBorderIcons() {
337
- return this.attributes.enableRotateBorderIcons as boolean;
338
- }
339
-
340
- /**
341
- * Gets the
342
- * @returns {BorderSet|*}
343
- */
344
- getBorderSet() {
345
- return this.borders;
346
- }
347
-
348
- getwindowsMap() {
349
- return this.windows;
350
- }
351
-
352
- /**
353
- * Visits all the nodes in the model and calls the given function for each
354
- * @param fn a function that takes visited node and a integer level as parameters
355
- */
356
- visitNodes(fn: (node: Node, level: number) => void) {
357
- this.borders.forEachNode(fn);
358
- for (const [_, w] of this.windows) {
359
- w.root!.forEachNode(fn, 0);
360
- }
361
- }
362
-
363
- visitWindowNodes(windowId: string, fn: (node: Node, level: number) => void) {
364
- if (this.windows.has(windowId)) {
365
- if (windowId === Model.MAIN_WINDOW_ID) {
366
- this.borders.forEachNode(fn);
367
- }
368
- this.windows.get(windowId)!.visitNodes(fn);
369
- }
370
- }
371
-
372
- /**
373
- * Gets a node by its id
374
- * @param id the id to find
375
- */
376
- getNodeById(id: string): Node | undefined {
377
- return this.idMap.get(id);
378
- }
379
-
380
- /**
381
- * Finds the first/top left tab set of the given node.
382
- * @param node The top node you want to begin searching from, deafults to the root node
383
- * @returns The first Tab Set
384
- */
385
- getFirstTabSet(node = this.windows.get(Model.MAIN_WINDOW_ID)!.root as Node): TabSetNode {
386
- const child = node.getChildren()[0];
387
- if (child instanceof TabSetNode) {
388
- return child;
389
- }
390
- else {
391
- return this.getFirstTabSet(child);
392
- }
393
- }
394
-
395
- /**
396
- * Loads the model from the given json object
397
- * @param json the json model to load
398
- * @returns {Model} a new Model object
399
- */
400
- static fromJson(json: IJsonModel) {
401
- const model = new Model();
402
- Model.attributeDefinitions.fromJson(json.global, model.attributes);
403
-
404
- if (json.borders) {
405
- model.borders = BorderSet.fromJson(json.borders, model);
406
- }
407
- if (json.popouts) {
408
- for (const windowId in json.popouts) {
409
- const windowJson = json.popouts[windowId];
410
- const layoutWindow = LayoutWindow.fromJson(windowJson, model, windowId);
411
- model.windows.set(windowId, layoutWindow);
412
- }
413
- }
414
-
415
- model.rootWindow.root = RowNode.fromJson(json.layout, model, model.getwindowsMap().get(Model.MAIN_WINDOW_ID)!);
416
- model.tidy(); // initial tidy of node tree
417
- return model;
418
- }
419
-
420
- /**
421
- * Converts the model to a json object
422
- * @returns {IJsonModel} json object that represents this model
423
- */
424
- toJson(): IJsonModel {
425
- const global: any = {};
426
- Model.attributeDefinitions.toJson(global, this.attributes);
427
-
428
- // save state of nodes
429
- this.visitNodes((node) => {
430
- node.fireEvent("save", {});
431
- });
432
-
433
- const windows: Record<string, IJsonPopout> = {};
434
- for (const [id, window] of this.windows) {
435
- if (id !== Model.MAIN_WINDOW_ID) {
436
- windows[id] = window.toJson();
437
- }
438
- }
439
-
440
- return {
441
- global,
442
- borders: this.borders.toJson(),
443
- layout: this.rootWindow.root!.toJson(),
444
- popouts: windows
445
- };
446
- }
447
-
448
- getSplitterSize() {
449
- return this.attributes.splitterSize as number;
450
- }
451
-
452
- getSplitterExtra() {
453
- return this.attributes.splitterExtra as number;
454
- }
455
-
456
- isEnableEdgeDock() {
457
- return this.attributes.enableEdgeDock as boolean;
458
- }
459
-
460
- isSplitterEnableHandle() {
461
- return this.attributes.splitterEnableHandle as boolean;
462
- }
463
-
464
- /**
465
- * Sets a function to allow/deny dropping a node
466
- * @param onAllowDrop function that takes the drag node and DropInfo and returns true if the drop is allowed
467
- */
468
- setOnAllowDrop(onAllowDrop: (dragNode: Node, dropInfo: DropInfo) => boolean) {
469
- this.onAllowDrop = onAllowDrop;
470
- }
471
-
472
- /**
473
- * set callback called when a new TabSet is created.
474
- * The tabNode can be undefined if it's the auto created first tabset in the root row (when the last
475
- * tab is deleted, the root tabset can be recreated)
476
- * @param onCreateTabSet
477
- */
478
- setOnCreateTabSet(onCreateTabSet: (tabNode?: TabNode) => ITabSetAttributes) {
479
- this.onCreateTabSet = onCreateTabSet;
480
- }
481
-
482
- addChangeListener(listener: ((action: Action) => void)) {
483
- this.changeListeners.push(listener);
484
- }
485
-
486
- removeChangeListener(listener: ((action: Action) => void)) {
487
- const pos = this.changeListeners.findIndex(l => l === listener);
488
- if (pos !== -1) {
489
- this.changeListeners.splice(pos, 1);
490
- }
491
- }
492
-
493
- toString() {
494
- return JSON.stringify(this.toJson());
495
- }
496
-
497
- /***********************internal ********************************/
498
-
499
- /** @internal */
500
- removeEmptyWindows() {
501
- const emptyWindows = new Set<string>();
502
- for (const [windowId] of this.windows) {
503
- if (windowId !== Model.MAIN_WINDOW_ID) {
504
- let count = 0;
505
- this.visitWindowNodes(windowId, (node) => {
506
- if (node instanceof TabNode) {
507
- count++;
508
- }
509
- });
510
- if (count === 0) {
511
- emptyWindows.add(windowId);
512
- }
513
- }
514
- }
515
-
516
- for (const windowId of emptyWindows) {
517
- this.windows.delete(windowId);
518
- }
519
- }
520
- /** @internal */
521
- setActiveTabset(tabsetNode: TabSetNode | undefined, windowId: string) {
522
- const window = this.windows.get(windowId);
523
- if (window) {
524
- if (tabsetNode) {
525
- window.activeTabSet = tabsetNode;
526
- } else {
527
- window.activeTabSet = undefined;
528
- }
529
- }
530
- }
531
-
532
- /** @internal */
533
- setMaximizedTabset(tabsetNode: (TabSetNode | undefined), windowId: string) {
534
- const window = this.windows.get(windowId);
535
- if (window) {
536
- if (tabsetNode) {
537
- window.maximizedTabSet = tabsetNode;
538
- } else {
539
- window.maximizedTabSet = undefined;
540
- }
541
- }
542
- }
543
-
544
- /** @internal */
545
- updateIdMap() {
546
- // regenerate idMap to stop it building up
547
- this.idMap.clear();
548
- this.visitNodes((node) => {
549
- this.idMap.set(node.getId(), node)
550
- // if (node instanceof RowNode) {
551
- // node.normalizeWeights();
552
- // }
553
- });
554
- // console.log(JSON.stringify(Object.keys(this._idMap)));
555
- }
556
-
557
- /** @internal */
558
- addNode(node: Node) {
559
- const id = node.getId();
560
- if (this.idMap.has(id)) {
561
- throw new Error(`Error: each node must have a unique id, duplicate id:${node.getId()}`);
562
- }
563
-
564
- this.idMap.set(id, node);
565
- }
566
-
567
- /** @internal */
568
- findDropTargetNode(windowId: string, dragNode: Node & IDraggable, x: number, y: number) {
569
- let node = (this.windows.get(windowId)!.root as RowNode).findDropTargetNode(windowId, dragNode, x, y);
570
- if (node === undefined && windowId === Model.MAIN_WINDOW_ID) {
571
- node = this.borders.findDropTargetNode(dragNode, x, y);
572
- }
573
- return node;
574
- }
575
-
576
- /** @internal */
577
- tidy() {
578
- // console.log("before _tidy", this.toString());
579
- for (const [_, window] of this.windows) {
580
- window.root!.tidy();
581
- }
582
- // console.log("after _tidy", this.toString());
583
- }
584
-
585
- /** @internal */
586
- updateAttrs(json: any) {
587
- Model.attributeDefinitions.update(json, this.attributes);
588
- }
589
-
590
- /** @internal */
591
- nextUniqueId() {
592
- return '#' + randomUUID();
593
- }
594
-
595
- /** @internal */
596
- getAttribute(name: string): any {
597
- return this.attributes[name];
598
- }
599
-
600
- /** @internal */
601
- getOnAllowDrop() {
602
- return this.onAllowDrop;
603
- }
604
-
605
- /** @internal */
606
- getOnCreateTabSet() {
607
- return this.onCreateTabSet;
608
- }
609
-
610
- static toTypescriptInterfaces() {
611
- Model.attributeDefinitions.pairAttributes("RowNode", RowNode.getAttributeDefinitions());
612
- Model.attributeDefinitions.pairAttributes("TabSetNode", TabSetNode.getAttributeDefinitions());
613
- Model.attributeDefinitions.pairAttributes("TabNode", TabNode.getAttributeDefinitions());
614
- Model.attributeDefinitions.pairAttributes("BorderNode", BorderNode.getAttributeDefinitions());
615
-
616
- let sb = [];
617
- sb.push(Model.attributeDefinitions.toTypescriptInterface("Global", undefined));
618
- sb.push(RowNode.getAttributeDefinitions().toTypescriptInterface("Row", Model.attributeDefinitions));
619
- sb.push(TabSetNode.getAttributeDefinitions().toTypescriptInterface("TabSet", Model.attributeDefinitions));
620
- sb.push(TabNode.getAttributeDefinitions().toTypescriptInterface("Tab", Model.attributeDefinitions));
621
- sb.push(BorderNode.getAttributeDefinitions().toTypescriptInterface("Border", Model.attributeDefinitions));
622
- console.log(sb.join("\n"));
623
- }
624
-
625
- /** @internal */
626
- private static createAttributeDefinitions(): AttributeDefinitions {
627
- const attributeDefinitions = new AttributeDefinitions();
628
-
629
- attributeDefinitions.add("enableEdgeDock", true).setType(Attribute.BOOLEAN).setDescription(
630
- `enable docking to the edges of the layout, this will show the edge indicators`
631
- );
632
- attributeDefinitions.add("rootOrientationVertical", false).setType(Attribute.BOOLEAN).setDescription(
633
- `the top level 'row' will layout horizontally by default, set this option true to make it layout vertically`
634
- );
635
- attributeDefinitions.add("enableRotateBorderIcons", true).setType(Attribute.BOOLEAN).setDescription(
636
- `boolean indicating if tab icons should rotate with the text in the left and right borders`
637
- );
638
-
639
- // splitter
640
- attributeDefinitions.add("splitterSize", 8).setType(Attribute.NUMBER).setDescription(
641
- `width in pixels of all splitters between tabsets/borders`
642
- );
643
- attributeDefinitions.add("splitterExtra", 0).setType(Attribute.NUMBER).setDescription(
644
- `additional width in pixels of the splitter hit test area`
645
- );
646
- attributeDefinitions.add("splitterEnableHandle", false).setType(Attribute.BOOLEAN).setDescription(
647
- `enable a small centralized handle on all splitters`
648
- );
649
-
650
- // tab
651
- attributeDefinitions.add("tabEnableClose", true).setType(Attribute.BOOLEAN);
652
- attributeDefinitions.add("tabCloseType", 1).setType("ICloseType");
653
- attributeDefinitions.add("tabEnablePopout", false).setType(Attribute.BOOLEAN).setAlias("tabEnableFloat");
654
- attributeDefinitions.add("tabEnablePopoutIcon", true).setType(Attribute.BOOLEAN);
655
- attributeDefinitions.add("tabEnablePopoutOverlay", false).setType(Attribute.BOOLEAN);
656
- attributeDefinitions.add("tabEnableDrag", true).setType(Attribute.BOOLEAN);
657
- attributeDefinitions.add("tabEnableRename", true).setType(Attribute.BOOLEAN);
658
- attributeDefinitions.add("tabContentClassName", undefined).setType(Attribute.STRING);
659
- attributeDefinitions.add("tabClassName", undefined).setType(Attribute.STRING);
660
- attributeDefinitions.add("tabIcon", undefined).setType(Attribute.STRING);
661
- attributeDefinitions.add("tabEnableRenderOnDemand", true).setType(Attribute.BOOLEAN);
662
- attributeDefinitions.add("tabDragSpeed", 0.3).setType(Attribute.NUMBER);
663
- attributeDefinitions.add("tabBorderWidth", -1).setType(Attribute.NUMBER);
664
- attributeDefinitions.add("tabBorderHeight", -1).setType(Attribute.NUMBER);
665
-
666
- // tabset
667
- attributeDefinitions.add("tabSetEnableDeleteWhenEmpty", true).setType(Attribute.BOOLEAN);
668
- attributeDefinitions.add("tabSetEnableDrop", true).setType(Attribute.BOOLEAN);
669
- attributeDefinitions.add("tabSetEnableDrag", true).setType(Attribute.BOOLEAN);
670
- attributeDefinitions.add("tabSetEnableDivide", true).setType(Attribute.BOOLEAN);
671
- attributeDefinitions.add("tabSetEnableMaximize", true).setType(Attribute.BOOLEAN);
672
- attributeDefinitions.add("tabSetEnableClose", false).setType(Attribute.BOOLEAN);
673
- attributeDefinitions.add("tabSetEnableSingleTabStretch", false).setType(Attribute.BOOLEAN);
674
- attributeDefinitions.add("tabSetAutoSelectTab", true).setType(Attribute.BOOLEAN);
675
- attributeDefinitions.add("tabSetEnableActiveIcon", false).setType(Attribute.BOOLEAN);
676
- attributeDefinitions.add("tabSetClassNameTabStrip", undefined).setType(Attribute.STRING);
677
- attributeDefinitions.add("tabSetEnableTabStrip", true).setType(Attribute.BOOLEAN);
678
- attributeDefinitions.add("tabSetEnableTabWrap", false).setType(Attribute.BOOLEAN);
679
- attributeDefinitions.add("tabSetTabLocation", "top").setType("ITabLocation");
680
- attributeDefinitions.add("tabMinWidth", DefaultMin).setType(Attribute.NUMBER);
681
- attributeDefinitions.add("tabMinHeight", DefaultMin).setType(Attribute.NUMBER);
682
- attributeDefinitions.add("tabSetMinWidth", DefaultMin).setType(Attribute.NUMBER);
683
- attributeDefinitions.add("tabSetMinHeight", DefaultMin).setType(Attribute.NUMBER);
684
- attributeDefinitions.add("tabMaxWidth", DefaultMax).setType(Attribute.NUMBER);
685
- attributeDefinitions.add("tabMaxHeight", DefaultMax).setType(Attribute.NUMBER);
686
- attributeDefinitions.add("tabSetMaxWidth", DefaultMax).setType(Attribute.NUMBER);
687
- attributeDefinitions.add("tabSetMaxHeight", DefaultMax).setType(Attribute.NUMBER);
688
- attributeDefinitions.add("tabSetEnableTabScrollbar", false).setType(Attribute.BOOLEAN);
689
-
690
- // border
691
- attributeDefinitions.add("borderSize", 200).setType(Attribute.NUMBER);
692
- attributeDefinitions.add("borderMinSize", DefaultMin).setType(Attribute.NUMBER);
693
- attributeDefinitions.add("borderMaxSize", DefaultMax).setType(Attribute.NUMBER);
694
- attributeDefinitions.add("borderEnableDrop", true).setType(Attribute.BOOLEAN);
695
- attributeDefinitions.add("borderAutoSelectTabWhenOpen", true).setType(Attribute.BOOLEAN);
696
- attributeDefinitions.add("borderAutoSelectTabWhenClosed", false).setType(Attribute.BOOLEAN);
697
- attributeDefinitions.add("borderClassName", undefined).setType(Attribute.STRING);
698
- attributeDefinitions.add("borderEnableAutoHide", false).setType(Attribute.BOOLEAN);
699
- attributeDefinitions.add("borderEnableTabScrollbar", false).setType(Attribute.BOOLEAN);
700
-
701
- return attributeDefinitions;
702
- }
703
- }
704
-