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
package/src/view/Tab.tsx DELETED
@@ -1,128 +0,0 @@
1
- import * as React from "react";
2
- import { TabNode } from "../model/TabNode";
3
- import { TabSetNode } from "../model/TabSetNode";
4
- import { CLASSES } from "../Types";
5
- import { LayoutInternal } from "./Layout";
6
- import { BorderNode } from "../model/BorderNode";
7
- import { Actions } from "../model/Actions";
8
-
9
- /** @internal */
10
- export interface ITabProps {
11
- layout: LayoutInternal;
12
- node: TabNode;
13
- selected: boolean;
14
- path: string;
15
- }
16
-
17
- /** @internal */
18
- export const Tab = (props: ITabProps) => {
19
- const { layout, selected, node, path } = props;
20
- const selfRef = React.useRef<HTMLDivElement | null>(null);
21
- const firstSelect = React.useRef<boolean>(true);
22
-
23
- const parentNode = node.getParent() as TabSetNode | BorderNode;
24
- const rect = parentNode.getContentRect()!;
25
-
26
- React.useLayoutEffect(() => {
27
- const element = node.getMoveableElement()!;
28
- selfRef.current!.appendChild(element);
29
- node.setMoveableElement(element);
30
-
31
- const handleScroll = () => {
32
- node.saveScrollPosition();
33
- };
34
-
35
- // keep scroll position
36
- element.addEventListener('scroll', handleScroll);
37
-
38
- // listen for clicks to change active tabset
39
- selfRef.current!.addEventListener("pointerdown", onPointerDown);
40
-
41
- return () => {
42
- element.removeEventListener('scroll', handleScroll);
43
- if (selfRef.current) {
44
- selfRef.current.removeEventListener("pointerdown", onPointerDown);
45
- }
46
- node.setVisible(false);
47
- }
48
- }, []);
49
-
50
- React.useEffect(() => {
51
- if (node.isSelected()) {
52
- if (firstSelect.current) {
53
- node.restoreScrollPosition(); // if window docked back in
54
- firstSelect.current = false;
55
- }
56
- }
57
- });
58
-
59
- const onPointerDown = () => {
60
- const parent = node.getParent()!; // cannot use parentNode here since will be out of date
61
- if (parent instanceof TabSetNode) {
62
- if (!parent.isActive()) {
63
- layout.doAction(Actions.setActiveTabset(parent.getId(), layout.getWindowId()));
64
- }
65
- }
66
- };
67
-
68
- node.setRect(rect); // needed for resize event
69
- const cm = layout.getClassName;
70
- const style: Record<string, any> = {};
71
-
72
- rect.styleWithPosition(style);
73
-
74
- let overlay = null;
75
-
76
- if (selected) {
77
- node.setVisible(true);
78
- if (document.hidden && node.isEnablePopoutOverlay()) {
79
- const overlayStyle: Record<string, any> = {};
80
- rect.styleWithPosition(overlayStyle);
81
- overlay = (<div style={overlayStyle} className={cm(CLASSES.FLEXLAYOUT__TAB_OVERLAY)}></div>)
82
- }
83
- } else {
84
- style.display = "none";
85
- node.setVisible(false);
86
- }
87
-
88
- if (parentNode instanceof TabSetNode) {
89
- if (node.getModel().getMaximizedTabset(layout.getWindowId()) !== undefined) {
90
- if (parentNode.isMaximized()) {
91
- style.zIndex = 10;
92
- } else {
93
- style.display = "none";
94
- }
95
- }
96
- }
97
-
98
- if (parentNode instanceof BorderNode) {
99
- if (!parentNode.isShowing()) {
100
- style.display = "none";
101
- }
102
- }
103
-
104
- let className = cm(CLASSES.FLEXLAYOUT__TAB);
105
- if (parentNode instanceof BorderNode) {
106
- className += " " + cm(CLASSES.FLEXLAYOUT__TAB_BORDER);
107
- className += " " + cm(CLASSES.FLEXLAYOUT__TAB_BORDER_ + parentNode.getLocation().getName());
108
- }
109
-
110
- if (node.getContentClassName() !== undefined) {
111
- className += " " + node.getContentClassName();
112
- }
113
-
114
- return (
115
- <>
116
- {overlay}
117
-
118
- <div
119
- ref={selfRef}
120
- style={style}
121
- className={className}
122
- data-layout-path={path}
123
- />
124
- </>
125
- );
126
- };
127
-
128
-
@@ -1,200 +0,0 @@
1
- import * as React from "react";
2
- import { I18nLabel } from "../I18nLabel";
3
- import { Actions } from "../model/Actions";
4
- import { TabNode } from "../model/TabNode";
5
- import { TabSetNode } from "../model/TabSetNode";
6
- import { LayoutInternal } from "./Layout";
7
- import { ICloseType } from "../model/ICloseType";
8
- import { CLASSES } from "../Types";
9
- import { getRenderStateEx, isAuxMouseEvent } from "./Utils";
10
-
11
- /** @internal */
12
- export interface ITabButtonProps {
13
- layout: LayoutInternal;
14
- node: TabNode;
15
- selected: boolean;
16
- path: string;
17
- }
18
-
19
- /** @internal */
20
- export const TabButton = (props: ITabButtonProps) => {
21
- const { layout, node, selected, path } = props;
22
- const selfRef = React.useRef<HTMLDivElement | null>(null);
23
- const contentRef = React.useRef<HTMLInputElement | null>(null);
24
- const icons = layout.getIcons();
25
-
26
- React.useLayoutEffect(() => {
27
- node.setTabRect(layout.getBoundingClientRect(selfRef.current!));
28
- if (layout.getEditingTab() === node) {
29
- (contentRef.current! as HTMLInputElement).select();
30
- }
31
- });
32
-
33
- const onDragStart = (event: React.DragEvent<HTMLElement>) => {
34
- if (node.isEnableDrag()) {
35
- event.stopPropagation(); // prevent starting a tabset drag as well
36
- layout.setDragNode(event.nativeEvent, node as TabNode);
37
- } else {
38
- event.preventDefault();
39
- }
40
- };
41
-
42
- const onDragEnd = (event: React.DragEvent<HTMLElement>) => {
43
- layout.clearDragMain();
44
- };
45
-
46
- const onAuxMouseClick = (event: React.MouseEvent<HTMLElement, MouseEvent>) => {
47
- if (isAuxMouseEvent(event)) {
48
- layout.auxMouseClick(node, event);
49
- }
50
- };
51
-
52
- const onContextMenu = (event: React.MouseEvent<HTMLElement, MouseEvent>) => {
53
- layout.showContextMenu(node, event);
54
- };
55
-
56
- const onClick = () => {
57
- layout.doAction(Actions.selectTab(node.getId()));
58
- };
59
-
60
- const onDoubleClick = (event: React.MouseEvent<HTMLElement>) => {
61
- if (node.isEnableRename()) {
62
- onRename();
63
- event.stopPropagation();
64
- }
65
- };
66
-
67
- const onRename = () => {
68
- layout.setEditingTab(node);
69
- layout.getCurrentDocument()!.body.addEventListener("pointerdown", onEndEdit);
70
- };
71
-
72
- const onEndEdit = (event: Event) => {
73
- if (event.target !== contentRef.current!) {
74
- layout.getCurrentDocument()!.body.removeEventListener("pointerdown", onEndEdit);
75
- layout.setEditingTab(undefined);
76
- }
77
- };
78
-
79
- const isClosable = () => {
80
- const closeType = node.getCloseType();
81
- if (selected || closeType === ICloseType.Always) {
82
- return true;
83
- }
84
- if (closeType === ICloseType.Visible) {
85
- // not selected but x should be visible due to hover
86
- if (window.matchMedia && window.matchMedia("(hover: hover) and (pointer: fine)").matches) {
87
- return true;
88
- }
89
- }
90
- return false;
91
- };
92
-
93
- const onClose = (event: React.MouseEvent<HTMLElement>) => {
94
- if (isClosable()) {
95
- layout.doAction(Actions.deleteTab(node.getId()));
96
- event.stopPropagation();
97
- }
98
- };
99
-
100
- const onClosePointerDown = (event: React.PointerEvent<HTMLElement>) => {
101
- event.stopPropagation();
102
- };
103
-
104
- const onTextBoxPointerDown = (event: React.PointerEvent<HTMLInputElement>) => {
105
- event.stopPropagation();
106
- };
107
-
108
- const onTextBoxKeyPress = (event: React.KeyboardEvent<HTMLInputElement>) => {
109
- if (event.code === 'Escape') {
110
- // esc
111
- layout.setEditingTab(undefined);
112
- } else if (event.code === 'Enter' || event.code === 'NumpadEnter') {
113
- // enter
114
- layout.setEditingTab(undefined);
115
- layout.doAction(Actions.renameTab(node.getId(), (event.target as HTMLInputElement).value));
116
- }
117
- };
118
-
119
- const cm = layout.getClassName;
120
- const parentNode = node.getParent() as TabSetNode;
121
-
122
- const isStretch = parentNode.isEnableSingleTabStretch() && parentNode.getChildren().length === 1;
123
- let baseClassName = isStretch ? CLASSES.FLEXLAYOUT__TAB_BUTTON_STRETCH : CLASSES.FLEXLAYOUT__TAB_BUTTON;
124
- let classNames = cm(baseClassName);
125
- classNames += " " + cm(baseClassName + "_" + parentNode.getTabLocation());
126
-
127
- if (!isStretch) {
128
- if (selected) {
129
- classNames += " " + cm(baseClassName + "--selected");
130
- } else {
131
- classNames += " " + cm(baseClassName + "--unselected");
132
- }
133
- }
134
-
135
- if (node.getClassName() !== undefined) {
136
- classNames += " " + node.getClassName();
137
- }
138
-
139
- const renderState = getRenderStateEx(layout, node);
140
-
141
- let content = renderState.content ? (
142
- <div className={cm(CLASSES.FLEXLAYOUT__TAB_BUTTON_CONTENT)}>
143
- {renderState.content}
144
- </div>) : null;
145
-
146
- const leading = renderState.leading ? (
147
- <div className={cm(CLASSES.FLEXLAYOUT__TAB_BUTTON_LEADING)}>
148
- {renderState.leading}
149
- </div>) : null;
150
-
151
- if (layout.getEditingTab() === node) {
152
- content = (
153
- <input
154
- ref={contentRef}
155
- className={cm(CLASSES.FLEXLAYOUT__TAB_BUTTON_TEXTBOX)}
156
- data-layout-path={path + "/textbox"}
157
- type="text"
158
- autoFocus={true}
159
- defaultValue={node.getName()}
160
- onKeyDown={onTextBoxKeyPress}
161
- onPointerDown={onTextBoxPointerDown}
162
- />
163
- );
164
- }
165
-
166
- if (node.isEnableClose() && !isStretch) {
167
- const closeTitle = layout.i18nName(I18nLabel.Close_Tab);
168
- renderState.buttons.push(
169
- <div
170
- key="close"
171
- data-layout-path={path + "/button/close"}
172
- title={closeTitle}
173
- className={cm(CLASSES.FLEXLAYOUT__TAB_BUTTON_TRAILING)}
174
- onPointerDown={onClosePointerDown}
175
- onClick={onClose}>
176
- {(typeof icons.close === "function") ? icons.close(node) : icons.close}
177
- </div>
178
- );
179
- }
180
-
181
- return (
182
- <div
183
- ref={selfRef}
184
- data-layout-path={path}
185
- className={classNames}
186
- onClick={onClick}
187
- onAuxClick={onAuxMouseClick}
188
- onContextMenu={onContextMenu}
189
- title={node.getHelpText()}
190
- draggable={true}
191
- onDragStart={onDragStart}
192
- onDragEnd={onDragEnd}
193
- onDoubleClick={onDoubleClick}
194
- >
195
- {leading}
196
- {content}
197
- {renderState.buttons}
198
- </div>
199
- );
200
- };
@@ -1,42 +0,0 @@
1
- import { TabNode } from "../model/TabNode";
2
- import { LayoutInternal } from "./Layout";
3
- import { CLASSES } from "../Types";
4
- import { getRenderStateEx } from "./Utils";
5
-
6
- /** @internal */
7
- export interface ITabButtonStampProps {
8
- node: TabNode;
9
- layout: LayoutInternal;
10
- }
11
-
12
- /** @internal */
13
- export const TabButtonStamp = (props: ITabButtonStampProps) => {
14
- const { layout, node } = props;
15
-
16
- const cm = layout.getClassName;
17
-
18
- let classNames = cm(CLASSES.FLEXLAYOUT__TAB_BUTTON_STAMP);
19
-
20
- const renderState = getRenderStateEx(layout, node);
21
-
22
- let content = renderState.content ? (
23
- <div className={cm(CLASSES.FLEXLAYOUT__TAB_BUTTON_CONTENT)}>
24
- {renderState.content}
25
- </div>)
26
- : node.getNameForOverflowMenu();
27
-
28
- const leading = renderState.leading ? (
29
- <div className={cm(CLASSES.FLEXLAYOUT__TAB_BUTTON_LEADING)}>
30
- {renderState.leading}
31
- </div>) : null;
32
-
33
- return (
34
- <div
35
- className={classNames}
36
- title={node.getHelpText()}
37
- >
38
- {leading}
39
- {content}
40
- </div>
41
- );
42
- };
@@ -1,305 +0,0 @@
1
- import * as React from "react";
2
- import { TabSetNode } from "../model/TabSetNode";
3
- import { BorderNode } from "../model/BorderNode";
4
- import { Orientation } from "../Orientation";
5
- import { LayoutInternal } from "./Layout";
6
- import { TabNode } from "../model/TabNode";
7
- import { startDrag } from "./Utils";
8
- import { Rect } from "../Rect";
9
-
10
- /** @internal */
11
- export const useTabOverflow = (
12
- layout: LayoutInternal,
13
- node: TabSetNode | BorderNode,
14
- orientation: Orientation,
15
- tabStripRef: React.RefObject<HTMLElement | null>,
16
- miniScrollRef: React.RefObject<HTMLElement | null>,
17
- tabClassName: string
18
- ) => {
19
- const [hiddenTabs, setHiddenTabs] = React.useState<number[]>([]);
20
- const [isShowHiddenTabs, setShowHiddenTabs] = React.useState<boolean>(false);
21
- const [isDockStickyButtons, setDockStickyButtons] = React.useState<boolean>(false);
22
-
23
- const selfRef = React.useRef<HTMLDivElement | null>(null);
24
- const userControlledPositionRef = React.useRef<boolean>(false);
25
- const updateHiddenTabsTimerRef = React.useRef<NodeJS.Timeout | undefined>(undefined);
26
- const hiddenTabsRef = React.useRef<number[]>([]);
27
- const thumbInternalPos = React.useRef<number>(0);
28
- const repositioningRef = React.useRef<boolean>(false);
29
- hiddenTabsRef.current = hiddenTabs;
30
-
31
- // if node id changes (new model) then reset scroll to 0
32
- React.useLayoutEffect(() => {
33
- if (tabStripRef.current) {
34
- setScrollPosition(0);
35
- }
36
- }, [node.getId()]);
37
-
38
- // if selected node or tabset/border rectangle change then unset usercontrolled (so selected tab will be kept in view)
39
- React.useLayoutEffect(() => {
40
- userControlledPositionRef.current = false;
41
- }, [node.getSelectedNode(), node.getRect().width, node.getRect().height]);
42
-
43
- React.useLayoutEffect(() => {
44
- checkForOverflow(); // if tabs + sticky buttons length > scroll area => move sticky buttons to right buttons
45
-
46
- if (userControlledPositionRef.current === false) {
47
- scrollIntoView();
48
- }
49
-
50
- updateScrollMetrics();
51
- updateHiddenTabs();
52
- });
53
-
54
- function scrollIntoView() {
55
- const selectedTabNode = node.getSelectedNode() as TabNode;
56
- if (selectedTabNode && tabStripRef.current) {
57
- const stripRect = layout.getBoundingClientRect(tabStripRef.current);
58
- const selectedRect = selectedTabNode.getTabRect()!;
59
-
60
- let shift = getNear(stripRect) - getNear(selectedRect);
61
- if (shift > 0 || getSize(selectedRect) > getSize(stripRect)) {
62
- setScrollPosition(getScrollPosition(tabStripRef.current) - shift);
63
- repositioningRef.current = true; // prevent onScroll setting userControlledPosition
64
- } else {
65
- shift = getFar(selectedRect) - getFar(stripRect);
66
- if (shift > 0) {
67
- setScrollPosition(getScrollPosition(tabStripRef.current) + shift);
68
- repositioningRef.current = true;
69
- }
70
- }
71
- }
72
- }
73
-
74
- const updateScrollMetrics = () => {
75
- if (tabStripRef.current && miniScrollRef.current) {
76
- const t = tabStripRef.current;
77
- const s = miniScrollRef.current;
78
-
79
- const size = getElementSize(t);
80
- const scrollSize = getScrollSize(t);
81
- const position = getScrollPosition(t);
82
-
83
- if (scrollSize > size && scrollSize > 0) {
84
- let thumbSize = size * size / scrollSize;
85
- let adjust = 0;
86
- if (thumbSize < 20) {
87
- adjust = 20 - thumbSize;
88
- thumbSize = 20;
89
- }
90
- const thumbPos = position * (size - adjust) / scrollSize;
91
- if (orientation === Orientation.HORZ) {
92
- s.style.width = thumbSize + "px";
93
- s.style.left = thumbPos + "px";
94
- } else {
95
- s.style.height = thumbSize + "px";
96
- s.style.top = thumbPos + "px";
97
- }
98
- s.style.display = "block";
99
- } else {
100
- s.style.display = "none";
101
- }
102
-
103
- if (orientation === Orientation.HORZ) {
104
- s.style.bottom = "0px";
105
- } else {
106
- s.style.right = "0px";
107
- }
108
- }
109
- }
110
-
111
- const updateHiddenTabs = () => {
112
- const newHiddenTabs = findHiddenTabs();
113
- const showHidden = newHiddenTabs.length > 0;
114
-
115
- if (showHidden !== isShowHiddenTabs) {
116
- setShowHiddenTabs(showHidden);
117
- }
118
-
119
- if (updateHiddenTabsTimerRef.current === undefined) {
120
- // throttle updates to prevent Maximum update depth exceeded error
121
- updateHiddenTabsTimerRef.current = setTimeout(() => {
122
- const newHiddenTabs = findHiddenTabs();
123
- if (!arraysEqual(newHiddenTabs, hiddenTabsRef.current)) {
124
- setHiddenTabs(newHiddenTabs);
125
- }
126
-
127
- updateHiddenTabsTimerRef.current = undefined;
128
- }, 100);
129
- }
130
- }
131
-
132
- const onScroll = () => {
133
- if (!repositioningRef.current){
134
- userControlledPositionRef.current=true;
135
- }
136
- repositioningRef.current = false;
137
- updateScrollMetrics()
138
- updateHiddenTabs();
139
- };
140
-
141
- const onScrollPointerDown = (event: React.PointerEvent<HTMLElement>) => {
142
- event.stopPropagation();
143
- miniScrollRef.current!.setPointerCapture(event.pointerId)
144
- const r = miniScrollRef.current?.getBoundingClientRect()!;
145
- if (orientation === Orientation.HORZ) {
146
- thumbInternalPos.current = event.clientX - r.x;
147
- } else {
148
- thumbInternalPos.current = event.clientY - r.y;
149
- }
150
- startDrag(event.currentTarget.ownerDocument, event, onDragMove, onDragEnd, onDragCancel);
151
- }
152
-
153
- const onDragMove = (x: number, y: number) => {
154
- if (tabStripRef.current && miniScrollRef.current) {
155
- const t = tabStripRef.current;
156
- const s = miniScrollRef.current;
157
- const size = getElementSize(t);
158
- const scrollSize = getScrollSize(t);
159
- const thumbSize = getElementSize(s);
160
-
161
- const r = t.getBoundingClientRect()!;
162
- let thumb = 0;
163
- if (orientation === Orientation.HORZ) {
164
- thumb = x - r.x - thumbInternalPos.current;
165
- } else {
166
- thumb = y - r.y - thumbInternalPos.current
167
- }
168
-
169
- thumb = Math.max(0, Math.min(scrollSize - thumbSize, thumb));
170
- if (size > 0) {
171
- const scrollPos = thumb * scrollSize / size;
172
- setScrollPosition(scrollPos);
173
- }
174
- }
175
- }
176
-
177
- const onDragEnd = () => {
178
- }
179
-
180
- const onDragCancel = () => {
181
- }
182
-
183
- const checkForOverflow = () => {
184
- if (tabStripRef.current) {
185
- const strip = tabStripRef.current;
186
- const tabContainer = strip.firstElementChild!;
187
-
188
- const offset = isDockStickyButtons ? 10 : 0; // prevents flashing, after sticky buttons docked set, must be 10 pixels smaller before unsetting
189
- const dock = (getElementSize(tabContainer) + offset) > getElementSize(tabStripRef.current);
190
- if (dock !== isDockStickyButtons) {
191
- setDockStickyButtons(dock);
192
- }
193
- }
194
- }
195
-
196
- const findHiddenTabs: () => number[] = () => {
197
- const hidden: number[] = [];
198
- if (tabStripRef.current) {
199
- const strip = tabStripRef.current;
200
- const stripRect = strip.getBoundingClientRect();
201
- const visibleNear = getNear(stripRect) - 1;
202
- const visibleFar = getFar(stripRect) + 1;
203
-
204
- const tabContainer = strip.firstElementChild!;
205
-
206
- let i = 0;
207
- Array.from(tabContainer.children).forEach((child) => {
208
- const tabRect = child.getBoundingClientRect();
209
-
210
- if (child.classList.contains(tabClassName)) {
211
- if (getNear(tabRect) < visibleNear || getFar(tabRect) > visibleFar) {
212
- hidden.push(i);
213
- }
214
- i++;
215
- }
216
- });
217
- }
218
-
219
- return hidden;
220
- };
221
-
222
- const onMouseWheel = (event: React.WheelEvent<HTMLElement>) => {
223
- if (tabStripRef.current) {
224
- if (node.getChildren().length === 0) return;
225
-
226
- let delta = 0;
227
- if (Math.abs(event.deltaY) > 0) {
228
- delta = -event.deltaY;
229
- if (event.deltaMode === 1) {
230
- // DOM_DELTA_LINE 0x01 The delta values are specified in lines.
231
- delta *= 40;
232
- }
233
- const newPos = getScrollPosition(tabStripRef.current) - delta;
234
- const maxScroll = getScrollSize(tabStripRef.current) - getElementSize(tabStripRef.current);
235
- const p = Math.max(0, Math.min(maxScroll, newPos));
236
- setScrollPosition(p);
237
- event.stopPropagation();
238
- }
239
- }
240
- };
241
-
242
- // orientation helpers:
243
-
244
- const getNear = (rect: DOMRect | Rect) => {
245
- if (orientation === Orientation.HORZ) {
246
- return rect.x;
247
- } else {
248
- return rect.y;
249
- }
250
- };
251
-
252
- const getFar = (rect: DOMRect | Rect) => {
253
- if (orientation === Orientation.HORZ) {
254
- return rect.right;
255
- } else {
256
- return rect.bottom;
257
- }
258
- };
259
-
260
- const getElementSize = (elm: Element) => {
261
- if (orientation === Orientation.HORZ) {
262
- return elm.clientWidth;
263
- } else {
264
- return elm.clientHeight;
265
- }
266
- }
267
-
268
- const getSize = (rect: DOMRect | Rect) => {
269
- if (orientation === Orientation.HORZ) {
270
- return rect.width;
271
- } else {
272
- return rect.height;
273
- }
274
- }
275
-
276
- const getScrollSize = (elm: Element) => {
277
- if (orientation === Orientation.HORZ) {
278
- return elm.scrollWidth;
279
- } else {
280
- return elm.scrollHeight;
281
- }
282
- }
283
-
284
- const setScrollPosition = (p: number) => {
285
- if (orientation === Orientation.HORZ) {
286
- tabStripRef.current!.scrollLeft = p;
287
- } else {
288
- tabStripRef.current!.scrollTop = p;
289
- }
290
- }
291
-
292
- const getScrollPosition = (elm: Element) => {
293
- if (orientation === Orientation.HORZ) {
294
- return elm.scrollLeft;
295
- } else {
296
- return elm.scrollTop;
297
- }
298
- }
299
-
300
- return { selfRef, userControlledPositionRef, onScroll, onScrollPointerDown, hiddenTabs, onMouseWheel, isDockStickyButtons, isShowHiddenTabs };
301
- };
302
-
303
- function arraysEqual(arr1: number[], arr2: number[]) {
304
- return arr1.length === arr2.length && arr1.every((val, index) => val === arr2[index]);
305
- }