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,475 +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 { showPopup } from "./PopupMenu";
7
- import { LayoutInternal, ITabSetRenderValues } from "./Layout";
8
- import { TabButton } from "./TabButton";
9
- import { useTabOverflow } from "./TabOverflowHook";
10
- import { Orientation } from "../Orientation";
11
- import { CLASSES } from "../Types";
12
- import { isAuxMouseEvent } from "./Utils";
13
- import { createPortal } from "react-dom";
14
- import { Rect } from "../Rect";
15
- import { splitterDragging } from "./Splitter";
16
-
17
- /** @internal */
18
- export interface ITabSetProps {
19
- layout: LayoutInternal;
20
- node: TabSetNode;
21
- }
22
-
23
- /** @internal */
24
- export const TabSet = (props: ITabSetProps) => {
25
- const { node, layout } = props;
26
-
27
- const tabStripRef = React.useRef<HTMLDivElement | null>(null);
28
- const miniScrollRef = React.useRef<HTMLDivElement | null>(null);
29
- const tabStripInnerRef = React.useRef<HTMLDivElement | null>(null);
30
- const contentRef = React.useRef<HTMLDivElement | null>(null);
31
- const buttonBarRef = React.useRef<HTMLDivElement | null>(null);
32
- const overflowbuttonRef = React.useRef<HTMLButtonElement | null>(null);
33
- const stickyButtonsRef = React.useRef<HTMLDivElement | null>(null);
34
- const timer = React.useRef<NodeJS.Timeout | undefined>(undefined);
35
-
36
- const icons = layout.getIcons();
37
-
38
- React.useLayoutEffect(() => {
39
- node.setRect(layout.getBoundingClientRect(selfRef.current!));
40
-
41
- if (tabStripRef.current) {
42
- node.setTabStripRect(layout.getBoundingClientRect(tabStripRef.current!));
43
- }
44
-
45
- const newContentRect = Rect.getContentRect(contentRef.current!).relativeTo(layout.getDomRect()!);
46
- if (!node.getContentRect().equals(newContentRect) && !isNaN(newContentRect.x)) {
47
- node.setContentRect(newContentRect);
48
- if (splitterDragging) { // next movement will draw tabs again, only redraw after pause/end
49
- if (timer.current) {
50
- clearTimeout(timer.current);
51
- }
52
- timer.current = setTimeout(() => {
53
- layout.redrawInternal("border content rect " + newContentRect);
54
- timer.current = undefined;
55
- }, 50);
56
- } else {
57
- layout.redrawInternal("border content rect " + newContentRect);
58
- }
59
- }
60
- });
61
-
62
- // this must be after the useEffect, so the node rect is already set (else window popin will not position tabs correctly)
63
- const { selfRef, userControlledPositionRef, onScroll, onScrollPointerDown, hiddenTabs, onMouseWheel, isDockStickyButtons, isShowHiddenTabs } =
64
- useTabOverflow(layout, node, Orientation.HORZ, tabStripInnerRef, miniScrollRef,
65
- layout.getClassName(CLASSES.FLEXLAYOUT__TAB_BUTTON));
66
-
67
- const onOverflowClick = (event: React.MouseEvent<HTMLElement, MouseEvent>) => {
68
- const callback = layout.getShowOverflowMenu();
69
- const items = hiddenTabs.map(h => { return { index: h, node: (node.getChildren()[h] as TabNode) }; });
70
- if (callback !== undefined) {
71
- callback(node, event, items, onOverflowItemSelect);
72
- } else {
73
- const element = overflowbuttonRef.current!;
74
- showPopup(
75
- element,
76
- node,
77
- items,
78
- onOverflowItemSelect,
79
- layout
80
- );
81
- }
82
- event.stopPropagation();
83
- };
84
-
85
- const onOverflowItemSelect = (item: { node: TabNode; index: number }) => {
86
- layout.doAction(Actions.selectTab(item.node.getId()));
87
- userControlledPositionRef.current = false;
88
- };
89
-
90
- const onDragStart = (event: React.DragEvent<HTMLElement>) => {
91
- if (!layout.getEditingTab()) {
92
- if (node.isEnableDrag()) {
93
- event.stopPropagation();
94
- layout.setDragNode(event.nativeEvent, node as TabSetNode);
95
- } else {
96
- event.preventDefault();
97
- }
98
- } else {
99
- event.preventDefault();
100
- }
101
- };
102
-
103
- const onPointerDown = (event: React.PointerEvent<HTMLElement>) => {
104
- if (!isAuxMouseEvent(event)) {
105
- layout.doAction(Actions.setActiveTabset(node.getId(), layout.getWindowId()));
106
- }
107
- };
108
-
109
- const onAuxMouseClick = (event: React.MouseEvent<HTMLElement, MouseEvent>) => {
110
- if (isAuxMouseEvent(event)) {
111
- layout.auxMouseClick(node, event);
112
- }
113
- };
114
-
115
- const onContextMenu = (event: React.MouseEvent<HTMLElement, MouseEvent>) => {
116
- layout.showContextMenu(node, event);
117
- };
118
-
119
- const onInterceptPointerDown = (event: React.PointerEvent) => {
120
- event.stopPropagation();
121
- };
122
-
123
- const onMaximizeToggle = (event: React.MouseEvent<HTMLElement, MouseEvent>) => {
124
- if (node.canMaximize()) {
125
- layout.maximize(node);
126
- }
127
- event.stopPropagation();
128
- };
129
-
130
- const onClose = (event: React.MouseEvent<HTMLElement, MouseEvent>) => {
131
- layout.doAction(Actions.deleteTabset(node.getId()));
132
- event.stopPropagation();
133
- };
134
-
135
- const onCloseTab = (event: React.MouseEvent<HTMLElement, MouseEvent>) => {
136
- layout.doAction(Actions.deleteTab(node.getChildren()[0].getId()));
137
- event.stopPropagation();
138
- };
139
-
140
- const onPopoutTab = (event: React.MouseEvent<HTMLElement, MouseEvent>) => {
141
- if (selectedTabNode !== undefined) {
142
- layout.doAction(Actions.popoutTab(selectedTabNode.getId()));
143
- // layout.doAction(Actions.popoutTabset(node.getId()));
144
- }
145
- event.stopPropagation();
146
- };
147
-
148
- const onDoubleClick = (event: React.MouseEvent<HTMLElement, MouseEvent>) => {
149
- if (node.canMaximize()) {
150
- layout.maximize(node);
151
- }
152
- };
153
-
154
- // Start Render
155
-
156
- const cm = layout.getClassName;
157
- const selectedTabNode: TabNode = node.getSelectedNode() as TabNode;
158
- const path = node.getPath();
159
-
160
- const tabs = [];
161
- if (node.isEnableTabStrip()) {
162
- for (let i = 0; i < node.getChildren().length; i++) {
163
- const child = node.getChildren()[i] as TabNode;
164
- let isSelected = node.getSelected() === i;
165
- tabs.push(
166
- <TabButton
167
- layout={layout}
168
- node={child}
169
- path={path + "/tb" + i}
170
- key={child.getId()}
171
- selected={isSelected}
172
- />);
173
- if (i < node.getChildren().length - 1) {
174
- tabs.push(
175
- <div key={"divider" + i} className={cm(CLASSES.FLEXLAYOUT__TABSET_TAB_DIVIDER)}></div>
176
- );
177
- }
178
- }
179
- }
180
-
181
- let stickyButtons: React.ReactNode[] = [];
182
- let buttons: React.ReactNode[] = [];
183
-
184
- // allow customization of header contents and buttons
185
- const renderState: ITabSetRenderValues = { stickyButtons, buttons, overflowPosition: undefined };
186
- layout.customizeTabSet(node, renderState);
187
- stickyButtons = renderState.stickyButtons;
188
- buttons = renderState.buttons;
189
-
190
- const isTabStretch = node.isEnableSingleTabStretch() && node.getChildren().length === 1;
191
- const showClose = (isTabStretch && ((node.getChildren()[0] as TabNode).isEnableClose())) || node.isEnableClose();
192
-
193
- if (renderState.overflowPosition === undefined) {
194
- renderState.overflowPosition = stickyButtons.length;
195
- }
196
-
197
- if (stickyButtons.length > 0) {
198
- if (!node.isEnableTabWrap() && (isDockStickyButtons || isTabStretch)) {
199
- buttons = [...stickyButtons, ...buttons];
200
- } else {
201
- tabs.push(<div
202
- ref={stickyButtonsRef}
203
- key="sticky_buttons_container"
204
- onPointerDown={onInterceptPointerDown}
205
- onDragStart={(e) => { e.preventDefault() }}
206
- className={cm(CLASSES.FLEXLAYOUT__TAB_TOOLBAR_STICKY_BUTTONS_CONTAINER)}
207
- >
208
- {stickyButtons}
209
- </div>);
210
- }
211
- }
212
-
213
- if (!node.isEnableTabWrap()) {
214
- if (isShowHiddenTabs) {
215
- const overflowTitle = layout.i18nName(I18nLabel.Overflow_Menu_Tooltip);
216
- let overflowContent;
217
- if (typeof icons.more === "function") {
218
- const items = hiddenTabs.map(h => { return { index: h, node: (node.getChildren()[h] as TabNode) }; });
219
- overflowContent = icons.more(node, items);
220
- } else {
221
- overflowContent = (<>
222
- {icons.more}
223
- <div className={cm(CLASSES.FLEXLAYOUT__TAB_BUTTON_OVERFLOW_COUNT)}>{hiddenTabs.length > 0 ? hiddenTabs.length : ""}</div>
224
- </>);
225
- }
226
- buttons.splice(Math.min(renderState.overflowPosition, buttons.length), 0,
227
- <button
228
- key="overflowbutton"
229
- data-layout-path={path + "/button/overflow"}
230
-
231
- ref={overflowbuttonRef}
232
- className={cm(CLASSES.FLEXLAYOUT__TAB_TOOLBAR_BUTTON) + " " + cm(CLASSES.FLEXLAYOUT__TAB_BUTTON_OVERFLOW)}
233
- title={overflowTitle}
234
- onClick={onOverflowClick}
235
- onPointerDown={onInterceptPointerDown}
236
- >
237
- {overflowContent}
238
- </button>
239
- );
240
- }
241
- }
242
-
243
- if (selectedTabNode !== undefined &&
244
- layout.isSupportsPopout() &&
245
- selectedTabNode.isEnablePopout() &&
246
- selectedTabNode.isEnablePopoutIcon()) {
247
-
248
- const popoutTitle = layout.i18nName(I18nLabel.Popout_Tab);
249
- buttons.push(
250
- <button
251
- key="popout"
252
- data-layout-path={path + "/button/popout"}
253
- title={popoutTitle}
254
- className={cm(CLASSES.FLEXLAYOUT__TAB_TOOLBAR_BUTTON) + " " + cm(CLASSES.FLEXLAYOUT__TAB_TOOLBAR_BUTTON_FLOAT)}
255
- onClick={onPopoutTab}
256
- onPointerDown={onInterceptPointerDown}
257
- >
258
- {(typeof icons.popout === "function") ? icons.popout(selectedTabNode) : icons.popout}
259
- </button>
260
- );
261
- }
262
-
263
- if (node.canMaximize()) {
264
- const minTitle = layout.i18nName(I18nLabel.Restore);
265
- const maxTitle = layout.i18nName(I18nLabel.Maximize);
266
- buttons.push(
267
- <button
268
- key="max"
269
- data-layout-path={path + "/button/max"}
270
- title={node.isMaximized() ? minTitle : maxTitle}
271
- className={cm(CLASSES.FLEXLAYOUT__TAB_TOOLBAR_BUTTON) + " " + cm(CLASSES.FLEXLAYOUT__TAB_TOOLBAR_BUTTON_ + (node.isMaximized() ? "max" : "min"))}
272
- onClick={onMaximizeToggle}
273
- onPointerDown={onInterceptPointerDown}
274
- >
275
- {node.isMaximized() ?
276
- (typeof icons.restore === "function") ? icons.restore(node) : icons.restore :
277
- (typeof icons.maximize === "function") ? icons.maximize(node) : icons.maximize}
278
- </button>
279
- );
280
- }
281
-
282
- if (!node.isMaximized() && showClose) {
283
- const title = isTabStretch ? layout.i18nName(I18nLabel.Close_Tab) : layout.i18nName(I18nLabel.Close_Tabset);
284
- buttons.push(
285
- <button
286
- key="close"
287
- data-layout-path={path + "/button/close"}
288
- title={title}
289
- className={cm(CLASSES.FLEXLAYOUT__TAB_TOOLBAR_BUTTON) + " " + cm(CLASSES.FLEXLAYOUT__TAB_TOOLBAR_BUTTON_CLOSE)}
290
- onClick={isTabStretch ? onCloseTab : onClose}
291
- onPointerDown={onInterceptPointerDown}
292
- >
293
- {(typeof icons.closeTabset === "function") ? icons.closeTabset(node) : icons.closeTabset}
294
- </button>
295
- );
296
- }
297
-
298
- if (node.isActive() && node.isEnableActiveIcon()) {
299
- const title = layout.i18nName(I18nLabel.Active_Tabset);
300
- buttons.push(
301
- <div
302
- key="active"
303
- data-layout-path={path + "/button/active"}
304
- title={title}
305
- className={cm(CLASSES.FLEXLAYOUT__TAB_TOOLBAR_ICON)}
306
- >
307
- {(typeof icons.activeTabset === "function") ? icons.activeTabset(node) : icons.activeTabset}
308
- </div>
309
- );
310
- }
311
-
312
- const buttonbar = (
313
- <div key="buttonbar" ref={buttonBarRef}
314
- className={cm(CLASSES.FLEXLAYOUT__TAB_TOOLBAR)}
315
- onPointerDown={onInterceptPointerDown}
316
- onDragStart={(e) => { e.preventDefault() }}
317
- >
318
- {buttons}
319
- </div>
320
- );
321
-
322
- let tabStrip;
323
-
324
- let tabStripClasses = cm(CLASSES.FLEXLAYOUT__TABSET_TABBAR_OUTER);
325
- if (node.getClassNameTabStrip() !== undefined) {
326
- tabStripClasses += " " + node.getClassNameTabStrip();
327
- }
328
- tabStripClasses += " " + CLASSES.FLEXLAYOUT__TABSET_TABBAR_OUTER_ + node.getTabLocation();
329
-
330
- if (node.isActive()) {
331
- tabStripClasses += " " + cm(CLASSES.FLEXLAYOUT__TABSET_SELECTED);
332
- }
333
-
334
- if (node.isMaximized()) {
335
- tabStripClasses += " " + cm(CLASSES.FLEXLAYOUT__TABSET_MAXIMIZED);
336
- }
337
-
338
- if (isTabStretch) {
339
- const tabNode = node.getChildren()[0] as TabNode;
340
- if (tabNode.getTabSetClassName() !== undefined) {
341
- tabStripClasses += " " + tabNode.getTabSetClassName();
342
- }
343
- }
344
-
345
- if (node.isEnableTabWrap()) {
346
- if (node.isEnableTabStrip()) {
347
- tabStrip = (
348
- <div className={tabStripClasses}
349
- style={{ flexWrap: "wrap", gap: "1px", marginTop: "2px" }}
350
- ref={tabStripRef}
351
- data-layout-path={path + "/tabstrip"}
352
- onPointerDown={onPointerDown}
353
- onDoubleClick={onDoubleClick}
354
- onContextMenu={onContextMenu}
355
- onClick={onAuxMouseClick}
356
- onAuxClick={onAuxMouseClick}
357
- draggable={true}
358
- onDragStart={onDragStart}
359
- >
360
- {tabs}
361
- <div style={{ flexGrow: 1 }} />
362
- {buttonbar}
363
- </div>
364
- );
365
- }
366
- } else {
367
- if (node.isEnableTabStrip()) {
368
- let miniScrollbar = undefined;
369
- if (node.isEnableTabScrollbar()) {
370
- miniScrollbar = (
371
- <div ref={miniScrollRef}
372
- className={cm(CLASSES.FLEXLAYOUT__MINI_SCROLLBAR)}
373
- onPointerDown={onScrollPointerDown}
374
- />
375
- );
376
- }
377
- tabStrip = (
378
- <div className={tabStripClasses}
379
- ref={tabStripRef}
380
- data-layout-path={path + "/tabstrip"}
381
- onPointerDown={onPointerDown}
382
- onDoubleClick={onDoubleClick}
383
- onContextMenu={onContextMenu}
384
- onClick={onAuxMouseClick}
385
- onAuxClick={onAuxMouseClick}
386
- draggable={true}
387
- onWheel={onMouseWheel}
388
- onDragStart={onDragStart}
389
- >
390
- <div className={cm(CLASSES.FLEXLAYOUT__MINI_SCROLLBAR_CONTAINER)}>
391
- <div ref={tabStripInnerRef}
392
- className={cm(CLASSES.FLEXLAYOUT__TABSET_TABBAR_INNER) + " " + cm(CLASSES.FLEXLAYOUT__TABSET_TABBAR_INNER_ + node.getTabLocation())}
393
- style={{ overflowX: 'auto', overflowY: "hidden" }}
394
- onScroll={onScroll}
395
- >
396
- <div
397
- style={{ width: (isTabStretch ? "100%" : "none") }}
398
- className={cm(CLASSES.FLEXLAYOUT__TABSET_TABBAR_INNER_TAB_CONTAINER) + " " + cm(CLASSES.FLEXLAYOUT__TABSET_TABBAR_INNER_TAB_CONTAINER_ + node.getTabLocation())}
399
- >
400
- {tabs}
401
- </div>
402
- </div>
403
- {miniScrollbar}
404
- </div>
405
- {buttonbar}
406
- </div>
407
- );
408
- }
409
- }
410
-
411
- var emptyTabset: React.ReactNode;
412
- if (node.getChildren().length === 0) {
413
- const placeHolderCallback = layout.getTabSetPlaceHolderCallback();
414
- if (placeHolderCallback) {
415
- emptyTabset = placeHolderCallback(node);
416
- }
417
- }
418
-
419
- let content = <div ref={contentRef} className={cm(CLASSES.FLEXLAYOUT__TABSET_CONTENT)}>
420
- {emptyTabset}
421
- </div>
422
-
423
- if (node.getTabLocation() === "top") {
424
- content = <>{tabStrip}{content}</>;
425
- } else {
426
- content = <>{content}{tabStrip}</>;
427
- }
428
-
429
- let style: Record<string, any> = {
430
- flexGrow: Math.max(1, node.getWeight() * 1000),
431
- minWidth: node.getMinWidth(),
432
- minHeight: node.getMinHeight(),
433
- maxWidth: node.getMaxWidth(),
434
- maxHeight: node.getMaxHeight()
435
- };
436
-
437
- if (node.getModel().getMaximizedTabset(layout.getWindowId()) !== undefined && !node.isMaximized()) {
438
- style.display = "none";
439
- }
440
-
441
- // note: tabset container is needed to allow flexbox to size without border/padding/margin
442
- // then inner tabset can have border/padding/margin for styling
443
- const tabset = (
444
- <div ref={selfRef}
445
- className={cm(CLASSES.FLEXLAYOUT__TABSET_CONTAINER)}
446
- style={style}
447
- >
448
- <div className={cm(CLASSES.FLEXLAYOUT__TABSET)}
449
- data-layout-path={path}
450
- >
451
- {content}
452
- </div>
453
- </div>
454
- );
455
-
456
- if (node.isMaximized()) {
457
- if (layout.getMainElement()) {
458
- return createPortal(
459
- <div style={{
460
- position: "absolute",
461
- display: "flex",
462
- top: 0, left: 0, bottom: 0, right: 0
463
- }}>
464
- {tabset}
465
- </div>, layout.getMainElement()!);
466
- } else {
467
- return tabset;
468
- }
469
- } else {
470
- return tabset;
471
- }
472
-
473
- };
474
-
475
-
@@ -1,135 +0,0 @@
1
- import * as React from "react";
2
- import { Node } from "../model/Node";
3
- import { TabNode } from "../model/TabNode";
4
- import { LayoutInternal } from "./Layout";
5
- import { TabSetNode } from "../model/TabSetNode";
6
-
7
- /** @internal */
8
- export function isDesktop() {
9
- const desktop = typeof window !== "undefined" && window.matchMedia && window.matchMedia("(hover: hover) and (pointer: fine)").matches;
10
- return desktop;
11
- }
12
- /** @internal */
13
- export function getRenderStateEx(
14
- layout: LayoutInternal,
15
- node: TabNode,
16
- iconAngle?: number
17
- ) {
18
- let leadingContent = undefined;
19
- let titleContent: React.ReactNode = node.getName();
20
- let name = node.getName();
21
- if (iconAngle === undefined) {
22
- iconAngle = 0;
23
- }
24
-
25
- if (leadingContent === undefined && node.getIcon() !== undefined) {
26
- if (iconAngle !== 0) {
27
- leadingContent = <img style={{ width: "1em", height: "1em", transform: "rotate(" + iconAngle + "deg)" }} src={node.getIcon()} alt="leadingContent" />;
28
- } else {
29
- leadingContent = <img style={{ width: "1em", height: "1em" }} src={node.getIcon()} alt="leadingContent" />;
30
- }
31
- }
32
-
33
- let buttons: any[] = [];
34
-
35
- // allow customization of leading contents (icon) and contents
36
- const renderState = { leading: leadingContent, content: titleContent, name, buttons };
37
- layout.customizeTab(node, renderState);
38
-
39
- node.setRenderedName(renderState.name);
40
-
41
- return renderState;
42
- }
43
-
44
- /** @internal */
45
- export function isAuxMouseEvent(event: React.MouseEvent<HTMLElement, MouseEvent> | React.TouchEvent<HTMLElement>) {
46
- let auxEvent = false;
47
- if (event.nativeEvent instanceof MouseEvent) {
48
- if (event.nativeEvent.button !== 0 || event.ctrlKey || event.altKey || event.metaKey || event.shiftKey) {
49
- auxEvent = true;
50
- }
51
- }
52
- return auxEvent;
53
- }
54
-
55
- export function enablePointerOnIFrames(enable: boolean, currentDocument: Document) {
56
- const iframes = [
57
- ...getElementsByTagName('iframe', currentDocument),
58
- ...getElementsByTagName('webview', currentDocument),
59
- ];
60
-
61
- for (const iframe of iframes) {
62
- (iframe as HTMLElement).style.pointerEvents = enable ? 'auto' : 'none';
63
- }
64
- };
65
-
66
- export function getElementsByTagName(tag: string, currentDocument: Document): Element[] {
67
- return [...currentDocument.getElementsByTagName(tag)];
68
- }
69
-
70
- export function startDrag(
71
- doc: Document,
72
- event: React.PointerEvent<HTMLElement>,
73
- drag: (x: number, y: number) => void,
74
- dragEnd: () => void,
75
- dragCancel: () => void) {
76
-
77
- event.preventDefault();
78
-
79
- const pointerMove = (ev: PointerEvent) => {
80
- ev.preventDefault();
81
- drag(ev.clientX, ev.clientY);
82
- };
83
-
84
- const pointerCancel = (ev: PointerEvent) => {
85
- ev.preventDefault();
86
- dragCancel();
87
- };
88
- const pointerUp = () => {
89
- doc.removeEventListener("pointermove", pointerMove);
90
- doc.removeEventListener("pointerup", pointerUp);
91
- doc.removeEventListener("pointercancel", pointerCancel);
92
- dragEnd();
93
- };
94
-
95
- doc.addEventListener("pointermove", pointerMove);
96
- doc.addEventListener("pointerup", pointerUp);
97
- doc.addEventListener('pointercancel', pointerCancel);
98
- }
99
-
100
- export function canDockToWindow(node: Node) {
101
- if (node instanceof TabNode) {
102
- return node.isEnablePopout();
103
- } else if (node instanceof TabSetNode) {
104
- for (const child of node.getChildren()) {
105
- if ((child as TabNode).isEnablePopout() === false) {
106
- return false;
107
- }
108
- }
109
- return true;
110
- }
111
- return false;
112
- }
113
-
114
- export function copyInlineStyles(source: HTMLElement, target: HTMLElement): boolean {
115
- // Get the inline style attribute from the source element
116
- const sourceStyle = source.getAttribute('style');
117
- const targetStyle = target.getAttribute('style');
118
- if (sourceStyle === targetStyle) return false;
119
-
120
- // console.log("copyInlineStyles", sourceStyle);
121
-
122
- if (sourceStyle) {
123
- // Set the style attribute on the target element
124
- target.setAttribute('style', sourceStyle);
125
- } else {
126
- // If the source has no inline style, clear the target's style attribute
127
- target.removeAttribute('style');
128
- }
129
- return true;
130
- }
131
-
132
- export function isSafari() {
133
- const userAgent = navigator.userAgent;
134
- return userAgent.includes("Safari") && !userAgent.includes("Chrome") && !userAgent.includes("Chromium");
135
- }