@genesis-community/golden-layout 2.6.0

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 (226) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +24 -0
  3. package/dist/cjs/index.js +40 -0
  4. package/dist/cjs/index.js.map +1 -0
  5. package/dist/cjs/ts/config/config.js +870 -0
  6. package/dist/cjs/ts/config/config.js.map +1 -0
  7. package/dist/cjs/ts/config/resolved-config.js +477 -0
  8. package/dist/cjs/ts/config/resolved-config.js.map +1 -0
  9. package/dist/cjs/ts/container/component-container.js +412 -0
  10. package/dist/cjs/ts/container/component-container.js.map +1 -0
  11. package/dist/cjs/ts/controls/browser-popout.js +298 -0
  12. package/dist/cjs/ts/controls/browser-popout.js.map +1 -0
  13. package/dist/cjs/ts/controls/drag-proxy.js +221 -0
  14. package/dist/cjs/ts/controls/drag-proxy.js.map +1 -0
  15. package/dist/cjs/ts/controls/drag-source.js +149 -0
  16. package/dist/cjs/ts/controls/drag-source.js.map +1 -0
  17. package/dist/cjs/ts/controls/drop-target-indicator.js +31 -0
  18. package/dist/cjs/ts/controls/drop-target-indicator.js.map +1 -0
  19. package/dist/cjs/ts/controls/header-button.js +34 -0
  20. package/dist/cjs/ts/controls/header-button.js.map +1 -0
  21. package/dist/cjs/ts/controls/header.js +366 -0
  22. package/dist/cjs/ts/controls/header.js.map +1 -0
  23. package/dist/cjs/ts/controls/splitter.js +42 -0
  24. package/dist/cjs/ts/controls/splitter.js.map +1 -0
  25. package/dist/cjs/ts/controls/tab.js +262 -0
  26. package/dist/cjs/ts/controls/tab.js.map +1 -0
  27. package/dist/cjs/ts/controls/tabs-container.js +236 -0
  28. package/dist/cjs/ts/controls/tabs-container.js.map +1 -0
  29. package/dist/cjs/ts/controls/transition-indicator.js +64 -0
  30. package/dist/cjs/ts/controls/transition-indicator.js.map +1 -0
  31. package/dist/cjs/ts/errors/external-error.js +46 -0
  32. package/dist/cjs/ts/errors/external-error.js.map +1 -0
  33. package/dist/cjs/ts/errors/internal-error.js +38 -0
  34. package/dist/cjs/ts/errors/internal-error.js.map +1 -0
  35. package/dist/cjs/ts/golden-layout.js +299 -0
  36. package/dist/cjs/ts/golden-layout.js.map +1 -0
  37. package/dist/cjs/ts/items/component-item.js +190 -0
  38. package/dist/cjs/ts/items/component-item.js.map +1 -0
  39. package/dist/cjs/ts/items/component-parentable-item.js +18 -0
  40. package/dist/cjs/ts/items/component-parentable-item.js.map +1 -0
  41. package/dist/cjs/ts/items/content-item.js +414 -0
  42. package/dist/cjs/ts/items/content-item.js.map +1 -0
  43. package/dist/cjs/ts/items/ground-item.js +352 -0
  44. package/dist/cjs/ts/items/ground-item.js.map +1 -0
  45. package/dist/cjs/ts/items/row-or-column.js +609 -0
  46. package/dist/cjs/ts/items/row-or-column.js.map +1 -0
  47. package/dist/cjs/ts/items/stack.js +841 -0
  48. package/dist/cjs/ts/items/stack.js.map +1 -0
  49. package/dist/cjs/ts/layout-manager.js +1618 -0
  50. package/dist/cjs/ts/layout-manager.js.map +1 -0
  51. package/dist/cjs/ts/utils/config-minifier.js +218 -0
  52. package/dist/cjs/ts/utils/config-minifier.js.map +1 -0
  53. package/dist/cjs/ts/utils/dom-constants.js +3 -0
  54. package/dist/cjs/ts/utils/dom-constants.js.map +1 -0
  55. package/dist/cjs/ts/utils/drag-listener.js +132 -0
  56. package/dist/cjs/ts/utils/drag-listener.js.map +1 -0
  57. package/dist/cjs/ts/utils/event-emitter.js +201 -0
  58. package/dist/cjs/ts/utils/event-emitter.js.map +1 -0
  59. package/dist/cjs/ts/utils/event-hub.js +135 -0
  60. package/dist/cjs/ts/utils/event-hub.js.map +1 -0
  61. package/dist/cjs/ts/utils/i18n-strings.js +74 -0
  62. package/dist/cjs/ts/utils/i18n-strings.js.map +1 -0
  63. package/dist/cjs/ts/utils/jquery-legacy.js +15 -0
  64. package/dist/cjs/ts/utils/jquery-legacy.js.map +1 -0
  65. package/dist/cjs/ts/utils/style-constants.js +11 -0
  66. package/dist/cjs/ts/utils/style-constants.js.map +1 -0
  67. package/dist/cjs/ts/utils/types.js +94 -0
  68. package/dist/cjs/ts/utils/types.js.map +1 -0
  69. package/dist/cjs/ts/utils/utils.js +211 -0
  70. package/dist/cjs/ts/utils/utils.js.map +1 -0
  71. package/dist/cjs/ts/virtual-layout.js +247 -0
  72. package/dist/cjs/ts/virtual-layout.js.map +1 -0
  73. package/dist/css/goldenlayout-base.css +319 -0
  74. package/dist/css/themes/goldenlayout-borderless-dark-theme.css +136 -0
  75. package/dist/css/themes/goldenlayout-dark-theme.css +139 -0
  76. package/dist/css/themes/goldenlayout-light-theme.css +129 -0
  77. package/dist/css/themes/goldenlayout-soda-theme.css +126 -0
  78. package/dist/css/themes/goldenlayout-translucent-theme.css +152 -0
  79. package/dist/esm/index.js +21 -0
  80. package/dist/esm/index.js.map +1 -0
  81. package/dist/esm/ts/config/config.js +864 -0
  82. package/dist/esm/ts/config/config.js.map +1 -0
  83. package/dist/esm/ts/config/resolved-config.js +474 -0
  84. package/dist/esm/ts/config/resolved-config.js.map +1 -0
  85. package/dist/esm/ts/container/component-container.js +408 -0
  86. package/dist/esm/ts/container/component-container.js.map +1 -0
  87. package/dist/esm/ts/controls/browser-popout.js +294 -0
  88. package/dist/esm/ts/controls/browser-popout.js.map +1 -0
  89. package/dist/esm/ts/controls/drag-proxy.js +217 -0
  90. package/dist/esm/ts/controls/drag-proxy.js.map +1 -0
  91. package/dist/esm/ts/controls/drag-source.js +145 -0
  92. package/dist/esm/ts/controls/drag-source.js.map +1 -0
  93. package/dist/esm/ts/controls/drop-target-indicator.js +27 -0
  94. package/dist/esm/ts/controls/drop-target-indicator.js.map +1 -0
  95. package/dist/esm/ts/controls/header-button.js +30 -0
  96. package/dist/esm/ts/controls/header-button.js.map +1 -0
  97. package/dist/esm/ts/controls/header.js +362 -0
  98. package/dist/esm/ts/controls/header.js.map +1 -0
  99. package/dist/esm/ts/controls/splitter.js +38 -0
  100. package/dist/esm/ts/controls/splitter.js.map +1 -0
  101. package/dist/esm/ts/controls/tab.js +258 -0
  102. package/dist/esm/ts/controls/tab.js.map +1 -0
  103. package/dist/esm/ts/controls/tabs-container.js +232 -0
  104. package/dist/esm/ts/controls/tabs-container.js.map +1 -0
  105. package/dist/esm/ts/controls/transition-indicator.js +60 -0
  106. package/dist/esm/ts/controls/transition-indicator.js.map +1 -0
  107. package/dist/esm/ts/errors/external-error.js +38 -0
  108. package/dist/esm/ts/errors/external-error.js.map +1 -0
  109. package/dist/esm/ts/errors/internal-error.js +31 -0
  110. package/dist/esm/ts/errors/internal-error.js.map +1 -0
  111. package/dist/esm/ts/golden-layout.js +295 -0
  112. package/dist/esm/ts/golden-layout.js.map +1 -0
  113. package/dist/esm/ts/items/component-item.js +186 -0
  114. package/dist/esm/ts/items/component-item.js.map +1 -0
  115. package/dist/esm/ts/items/component-parentable-item.js +14 -0
  116. package/dist/esm/ts/items/component-parentable-item.js.map +1 -0
  117. package/dist/esm/ts/items/content-item.js +410 -0
  118. package/dist/esm/ts/items/content-item.js.map +1 -0
  119. package/dist/esm/ts/items/ground-item.js +348 -0
  120. package/dist/esm/ts/items/ground-item.js.map +1 -0
  121. package/dist/esm/ts/items/row-or-column.js +605 -0
  122. package/dist/esm/ts/items/row-or-column.js.map +1 -0
  123. package/dist/esm/ts/items/stack.js +837 -0
  124. package/dist/esm/ts/items/stack.js.map +1 -0
  125. package/dist/esm/ts/layout-manager.js +1614 -0
  126. package/dist/esm/ts/layout-manager.js.map +1 -0
  127. package/dist/esm/ts/utils/config-minifier.js +215 -0
  128. package/dist/esm/ts/utils/config-minifier.js.map +1 -0
  129. package/dist/esm/ts/utils/dom-constants.js +2 -0
  130. package/dist/esm/ts/utils/dom-constants.js.map +1 -0
  131. package/dist/esm/ts/utils/drag-listener.js +128 -0
  132. package/dist/esm/ts/utils/drag-listener.js.map +1 -0
  133. package/dist/esm/ts/utils/event-emitter.js +197 -0
  134. package/dist/esm/ts/utils/event-emitter.js.map +1 -0
  135. package/dist/esm/ts/utils/event-hub.js +131 -0
  136. package/dist/esm/ts/utils/event-hub.js.map +1 -0
  137. package/dist/esm/ts/utils/i18n-strings.js +71 -0
  138. package/dist/esm/ts/utils/i18n-strings.js.map +1 -0
  139. package/dist/esm/ts/utils/jquery-legacy.js +11 -0
  140. package/dist/esm/ts/utils/jquery-legacy.js.map +1 -0
  141. package/dist/esm/ts/utils/style-constants.js +8 -0
  142. package/dist/esm/ts/utils/style-constants.js.map +1 -0
  143. package/dist/esm/ts/utils/types.js +91 -0
  144. package/dist/esm/ts/utils/types.js.map +1 -0
  145. package/dist/esm/ts/utils/utils.js +191 -0
  146. package/dist/esm/ts/utils/utils.js.map +1 -0
  147. package/dist/esm/ts/virtual-layout.js +243 -0
  148. package/dist/esm/ts/virtual-layout.js.map +1 -0
  149. package/dist/img/lm_close_black.png +0 -0
  150. package/dist/img/lm_close_tab_white.png +0 -0
  151. package/dist/img/lm_close_white.png +0 -0
  152. package/dist/img/lm_maximise_black.png +0 -0
  153. package/dist/img/lm_maximise_white.png +0 -0
  154. package/dist/img/lm_minimize_black.png +0 -0
  155. package/dist/img/lm_minimize_white.png +0 -0
  156. package/dist/img/lm_popin_black.png +0 -0
  157. package/dist/img/lm_popin_white.png +0 -0
  158. package/dist/img/lm_popout_black.png +0 -0
  159. package/dist/img/lm_popout_white.png +0 -0
  160. package/dist/less/goldenlayout-base.less +422 -0
  161. package/dist/less/themes/goldenlayout-borderless-dark-theme.less +230 -0
  162. package/dist/less/themes/goldenlayout-dark-theme.less +233 -0
  163. package/dist/less/themes/goldenlayout-light-theme.less +223 -0
  164. package/dist/less/themes/goldenlayout-soda-theme.less +211 -0
  165. package/dist/less/themes/goldenlayout-translucent-theme.less +237 -0
  166. package/dist/scss/goldenlayout-base.scss +422 -0
  167. package/dist/scss/themes/_goldenlayout-var-theme.scss +232 -0
  168. package/dist/types/golden-layout-untrimmed.d.ts +3428 -0
  169. package/dist/types/index.d.ts +2246 -0
  170. package/dist/types/tsdoc-metadata.json +11 -0
  171. package/package.json +107 -0
  172. package/src/TOOLCHAIN.md +54 -0
  173. package/src/img/lm_close_black.png +0 -0
  174. package/src/img/lm_close_tab_white.png +0 -0
  175. package/src/img/lm_close_white.png +0 -0
  176. package/src/img/lm_maximise_black.png +0 -0
  177. package/src/img/lm_maximise_white.png +0 -0
  178. package/src/img/lm_minimize_black.png +0 -0
  179. package/src/img/lm_minimize_white.png +0 -0
  180. package/src/img/lm_popin_black.png +0 -0
  181. package/src/img/lm_popin_white.png +0 -0
  182. package/src/img/lm_popout_black.png +0 -0
  183. package/src/img/lm_popout_white.png +0 -0
  184. package/src/index.ts +21 -0
  185. package/src/less/goldenlayout-base.less +422 -0
  186. package/src/less/themes/goldenlayout-borderless-dark-theme.less +230 -0
  187. package/src/less/themes/goldenlayout-dark-theme.less +233 -0
  188. package/src/less/themes/goldenlayout-light-theme.less +223 -0
  189. package/src/less/themes/goldenlayout-soda-theme.less +211 -0
  190. package/src/less/themes/goldenlayout-translucent-theme.less +237 -0
  191. package/src/scss/goldenlayout-base.scss +422 -0
  192. package/src/scss/themes/_goldenlayout-var-theme.scss +232 -0
  193. package/src/ts/config/config.ts +1283 -0
  194. package/src/ts/config/resolved-config.ts +621 -0
  195. package/src/ts/container/component-container.ts +500 -0
  196. package/src/ts/controls/browser-popout.ts +325 -0
  197. package/src/ts/controls/drag-proxy.ts +259 -0
  198. package/src/ts/controls/drag-source.ts +167 -0
  199. package/src/ts/controls/drop-target-indicator.ts +35 -0
  200. package/src/ts/controls/header-button.ts +39 -0
  201. package/src/ts/controls/header.ts +483 -0
  202. package/src/ts/controls/splitter.ts +50 -0
  203. package/src/ts/controls/tab.ts +293 -0
  204. package/src/ts/controls/tabs-container.ts +281 -0
  205. package/src/ts/controls/transition-indicator.ts +78 -0
  206. package/src/ts/errors/external-error.ts +39 -0
  207. package/src/ts/errors/internal-error.ts +34 -0
  208. package/src/ts/golden-layout.ts +365 -0
  209. package/src/ts/items/component-item.ts +252 -0
  210. package/src/ts/items/component-parentable-item.ts +16 -0
  211. package/src/ts/items/content-item.ts +513 -0
  212. package/src/ts/items/ground-item.ts +404 -0
  213. package/src/ts/items/row-or-column.ts +707 -0
  214. package/src/ts/items/stack.ts +975 -0
  215. package/src/ts/layout-manager.ts +1862 -0
  216. package/src/ts/utils/config-minifier.ts +235 -0
  217. package/src/ts/utils/dom-constants.ts +44 -0
  218. package/src/ts/utils/drag-listener.ts +178 -0
  219. package/src/ts/utils/event-emitter.ts +275 -0
  220. package/src/ts/utils/event-hub.ts +163 -0
  221. package/src/ts/utils/i18n-strings.ts +96 -0
  222. package/src/ts/utils/jquery-legacy.ts +12 -0
  223. package/src/ts/utils/style-constants.ts +6 -0
  224. package/src/ts/utils/types.ts +145 -0
  225. package/src/ts/utils/utils.ts +206 -0
  226. package/src/ts/virtual-layout.ts +328 -0
@@ -0,0 +1,837 @@
1
+ import { ItemConfig } from '../config/config';
2
+ import { ResolvedHeaderedItemConfig, ResolvedItemConfig, ResolvedStackItemConfig } from '../config/resolved-config';
3
+ import { Header } from '../controls/header';
4
+ import { AssertError, UnexpectedNullError, UnexpectedUndefinedError } from '../errors/internal-error';
5
+ import { EventEmitter } from '../utils/event-emitter';
6
+ import { ItemType, Side, SizeUnitEnum, WidthOrHeightPropertyName } from '../utils/types';
7
+ import { getElementWidthAndHeight, numberToPixels, setElementDisplayVisibility } from '../utils/utils';
8
+ import { ComponentItem } from './component-item';
9
+ import { ComponentParentableItem } from './component-parentable-item';
10
+ import { ContentItem } from './content-item';
11
+ /** @public */
12
+ export class Stack extends ComponentParentableItem {
13
+ /** @internal */
14
+ constructor(layoutManager, config, parent) {
15
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u;
16
+ super(layoutManager, config, parent, Stack.createElement(document));
17
+ /** @internal */
18
+ this._headerSideChanged = false;
19
+ /** @internal */
20
+ this._resizeListener = () => this.handleResize();
21
+ /** @internal */
22
+ this._maximisedListener = () => this.handleMaximised();
23
+ /** @internal */
24
+ this._minimisedListener = () => this.handleMinimised();
25
+ this._headerConfig = config.header;
26
+ const layoutHeaderConfig = layoutManager.layoutConfig.header;
27
+ const configContent = config.content;
28
+ // If stack has only one component, then we can also check this for header settings
29
+ let componentHeaderConfig;
30
+ if (configContent.length !== 1) {
31
+ componentHeaderConfig = undefined;
32
+ }
33
+ else {
34
+ const firstChildItemConfig = configContent[0];
35
+ componentHeaderConfig = firstChildItemConfig.header; // will be undefined if not component (and wont be stack)
36
+ }
37
+ this._initialWantMaximise = config.maximised;
38
+ this._initialActiveItemIndex = (_a = config.activeItemIndex) !== null && _a !== void 0 ? _a : 0; // make sure defined
39
+ // check for defined value for each item in order of Stack (this Item), Component (first child), Manager.
40
+ const show = (_d = (_c = (_b = this._headerConfig) === null || _b === void 0 ? void 0 : _b.show) !== null && _c !== void 0 ? _c : componentHeaderConfig === null || componentHeaderConfig === void 0 ? void 0 : componentHeaderConfig.show) !== null && _d !== void 0 ? _d : layoutHeaderConfig.show;
41
+ const popout = (_g = (_f = (_e = this._headerConfig) === null || _e === void 0 ? void 0 : _e.popout) !== null && _f !== void 0 ? _f : componentHeaderConfig === null || componentHeaderConfig === void 0 ? void 0 : componentHeaderConfig.popout) !== null && _g !== void 0 ? _g : layoutHeaderConfig.popout;
42
+ const maximise = (_k = (_j = (_h = this._headerConfig) === null || _h === void 0 ? void 0 : _h.maximise) !== null && _j !== void 0 ? _j : componentHeaderConfig === null || componentHeaderConfig === void 0 ? void 0 : componentHeaderConfig.maximise) !== null && _k !== void 0 ? _k : layoutHeaderConfig.maximise;
43
+ const close = (_o = (_m = (_l = this._headerConfig) === null || _l === void 0 ? void 0 : _l.close) !== null && _m !== void 0 ? _m : componentHeaderConfig === null || componentHeaderConfig === void 0 ? void 0 : componentHeaderConfig.close) !== null && _o !== void 0 ? _o : layoutHeaderConfig.close;
44
+ const minimise = (_r = (_q = (_p = this._headerConfig) === null || _p === void 0 ? void 0 : _p.minimise) !== null && _q !== void 0 ? _q : componentHeaderConfig === null || componentHeaderConfig === void 0 ? void 0 : componentHeaderConfig.minimise) !== null && _r !== void 0 ? _r : layoutHeaderConfig.minimise;
45
+ const tabDropdown = (_u = (_t = (_s = this._headerConfig) === null || _s === void 0 ? void 0 : _s.tabDropdown) !== null && _t !== void 0 ? _t : componentHeaderConfig === null || componentHeaderConfig === void 0 ? void 0 : componentHeaderConfig.tabDropdown) !== null && _u !== void 0 ? _u : layoutHeaderConfig.tabDropdown;
46
+ this._maximisedEnabled = maximise !== false;
47
+ const headerSettings = {
48
+ show: show !== false,
49
+ side: show === false ? Side.top : show,
50
+ popoutEnabled: popout !== false,
51
+ popoutLabel: popout === false ? '' : popout,
52
+ maximiseEnabled: this._maximisedEnabled,
53
+ maximiseLabel: maximise === false ? '' : maximise,
54
+ closeEnabled: close !== false,
55
+ closeLabel: close === false ? '' : close,
56
+ minimiseEnabled: true,
57
+ minimiseLabel: minimise,
58
+ tabDropdownEnabled: tabDropdown !== false,
59
+ tabDropdownLabel: tabDropdown === false ? '' : tabDropdown,
60
+ };
61
+ this._header = new Header(layoutManager, this, headerSettings, config.isClosable && close !== false, () => this.getActiveComponentItem(), () => this.remove(), () => this.handlePopoutEvent(), () => this.toggleMaximise(), (ev) => this.handleHeaderClickEvent(ev), (ev) => this.handleHeaderTouchStartEvent(ev), (item) => this.handleHeaderComponentRemoveEvent(item), (item) => this.handleHeaderComponentFocusEvent(item), (x, y, dragListener, item) => this.handleHeaderComponentStartDragEvent(x, y, dragListener, item));
62
+ // this._dropZones = {};
63
+ this.isStack = true;
64
+ this._childElementContainer = document.createElement('section');
65
+ this._childElementContainer.classList.add("lm_items" /* DomConstants.ClassName.Items */);
66
+ this.on('resize', this._resizeListener);
67
+ if (this._maximisedEnabled) {
68
+ this.on('maximised', this._maximisedListener);
69
+ this.on('minimised', this._minimisedListener);
70
+ }
71
+ this.element.appendChild(this._header.element);
72
+ this.element.appendChild(this._childElementContainer);
73
+ this.setupHeaderPosition();
74
+ this._header.updateClosability();
75
+ }
76
+ get childElementContainer() { return this._childElementContainer; }
77
+ get header() { return this._header; }
78
+ get headerShow() { return this._header.show; }
79
+ get headerSide() { return this._header.side; }
80
+ get headerLeftRightSided() { return this._header.leftRightSided; }
81
+ /** @internal */
82
+ get contentAreaDimensions() { return this._contentAreaDimensions; }
83
+ /** @internal */
84
+ get initialWantMaximise() { return this._initialWantMaximise; }
85
+ get isMaximised() { return this === this.layoutManager.maximisedStack; }
86
+ get stackParent() {
87
+ if (!this.parent) {
88
+ throw new Error('Stack should always have a parent');
89
+ }
90
+ return this.parent;
91
+ }
92
+ /** @internal */
93
+ updateSize(force) {
94
+ this.layoutManager.beginVirtualSizedContainerAdding();
95
+ try {
96
+ this.updateNodeSize();
97
+ this.updateContentItemsSize(force);
98
+ }
99
+ finally {
100
+ this.layoutManager.endVirtualSizedContainerAdding();
101
+ }
102
+ }
103
+ /** @internal */
104
+ init() {
105
+ if (this.isInitialised === true)
106
+ return;
107
+ this.updateNodeSize();
108
+ for (let i = 0; i < this.contentItems.length; i++) {
109
+ this._childElementContainer.appendChild(this.contentItems[i].element);
110
+ }
111
+ super.init();
112
+ const contentItems = this.contentItems;
113
+ const contentItemCount = contentItems.length;
114
+ if (contentItemCount > 0) { // contentItemCount will be 0 on drag drop
115
+ if (this._initialActiveItemIndex < 0 || this._initialActiveItemIndex >= contentItemCount) {
116
+ throw new Error(`ActiveItemIndex out of range: ${this._initialActiveItemIndex} id: ${this.id}`);
117
+ }
118
+ else {
119
+ for (let i = 0; i < contentItemCount; i++) {
120
+ const contentItem = contentItems[i];
121
+ if (!(contentItem instanceof ComponentItem)) {
122
+ throw new Error(`Stack Content Item is not of type ComponentItem: ${i} id: ${this.id}`);
123
+ }
124
+ else {
125
+ this._header.createTab(contentItem, i);
126
+ contentItem.hide();
127
+ contentItem.container.setBaseLogicalZIndex();
128
+ }
129
+ }
130
+ this.setActiveComponentItem(contentItems[this._initialActiveItemIndex], false);
131
+ this._header.updateTabSizes();
132
+ }
133
+ }
134
+ this._header.updateClosability();
135
+ this.initContentItems();
136
+ }
137
+ /** @deprecated Use {@link (Stack:class).setActiveComponentItem} */
138
+ setActiveContentItem(item) {
139
+ if (!ContentItem.isComponentItem(item)) {
140
+ throw new Error('Stack.setActiveContentItem: item is not a ComponentItem');
141
+ }
142
+ else {
143
+ this.setActiveComponentItem(item, false);
144
+ }
145
+ }
146
+ setActiveComponentItem(componentItem, focus, suppressFocusEvent = false) {
147
+ if (this._activeComponentItem !== componentItem) {
148
+ if (this.contentItems.indexOf(componentItem) === -1) {
149
+ throw new Error('componentItem is not a child of this stack');
150
+ }
151
+ else {
152
+ this.layoutManager.beginSizeInvalidation();
153
+ try {
154
+ if (this._activeComponentItem !== undefined) {
155
+ this._activeComponentItem.hide();
156
+ }
157
+ this._activeComponentItem = componentItem;
158
+ this._header.processActiveComponentChanged(componentItem);
159
+ componentItem.show();
160
+ }
161
+ finally {
162
+ this.layoutManager.endSizeInvalidation();
163
+ }
164
+ this.emit('activeContentItemChanged', componentItem);
165
+ this.layoutManager.emit('activeContentItemChanged', componentItem);
166
+ this.emitStateChangedEvent();
167
+ }
168
+ }
169
+ if (this.focused || focus) {
170
+ this.layoutManager.setFocusedComponentItem(componentItem, suppressFocusEvent);
171
+ }
172
+ }
173
+ /** @deprecated Use {@link (Stack:class).getActiveComponentItem} */
174
+ getActiveContentItem() {
175
+ var _a;
176
+ return (_a = this.getActiveComponentItem()) !== null && _a !== void 0 ? _a : null;
177
+ }
178
+ getActiveComponentItem() {
179
+ return this._activeComponentItem;
180
+ }
181
+ /** @internal */
182
+ focusActiveContentItem() {
183
+ var _a;
184
+ (_a = this._activeComponentItem) === null || _a === void 0 ? void 0 : _a.focus();
185
+ }
186
+ /** @internal */
187
+ setFocusedValue(value) {
188
+ this._header.applyFocusedValue(value);
189
+ super.setFocusedValue(value);
190
+ }
191
+ /** @internal */
192
+ setRowColumnClosable(value) {
193
+ this._header.setRowColumnClosable(value);
194
+ }
195
+ newComponent(componentType, componentState, title, index) {
196
+ const itemConfig = {
197
+ type: 'component',
198
+ componentType,
199
+ componentState,
200
+ title,
201
+ };
202
+ return this.newItem(itemConfig, index);
203
+ }
204
+ addComponent(componentType, componentState, title, index) {
205
+ const itemConfig = {
206
+ type: 'component',
207
+ componentType,
208
+ componentState,
209
+ title,
210
+ };
211
+ return this.addItem(itemConfig, index);
212
+ }
213
+ newItem(itemConfig, index) {
214
+ index = this.addItem(itemConfig, index);
215
+ return this.contentItems[index];
216
+ }
217
+ addItem(itemConfig, index) {
218
+ this.layoutManager.checkMinimiseMaximisedStack();
219
+ const resolvedItemConfig = ItemConfig.resolve(itemConfig, false);
220
+ const contentItem = this.layoutManager.createAndInitContentItem(resolvedItemConfig, this);
221
+ return this.addChild(contentItem, index);
222
+ }
223
+ addChild(contentItem, index, focus = false) {
224
+ if (index !== undefined && index > this.contentItems.length) {
225
+ index -= 1;
226
+ throw new AssertError('SAC99728'); // undisplayChild() removed so this condition should no longer occur
227
+ }
228
+ if (!(contentItem instanceof ComponentItem)) {
229
+ throw new AssertError('SACC88532'); // Stacks can only have Component children
230
+ }
231
+ else {
232
+ index = super.addChild(contentItem, index);
233
+ this._childElementContainer.appendChild(contentItem.element);
234
+ this._header.createTab(contentItem, index);
235
+ this.setActiveComponentItem(contentItem, focus);
236
+ this._header.updateTabSizes();
237
+ this.updateSize(false);
238
+ contentItem.container.setBaseLogicalZIndex();
239
+ this._header.updateClosability();
240
+ this.emitStateChangedEvent();
241
+ return index;
242
+ }
243
+ }
244
+ removeChild(contentItem, keepChild) {
245
+ const componentItem = contentItem;
246
+ const index = this.contentItems.indexOf(componentItem);
247
+ const stackWillBeDeleted = this.contentItems.length === 1;
248
+ if (this._activeComponentItem === componentItem) {
249
+ if (componentItem.focused) {
250
+ componentItem.blur();
251
+ }
252
+ if (!stackWillBeDeleted) {
253
+ // At this point we're already sure we have at least one content item left *after*
254
+ // removing contentItem, so we can safely assume index 1 is a valid one if
255
+ // the index of contentItem is 0, otherwise we just use the previous content item.
256
+ const newActiveComponentIdx = index === 0 ? 1 : index - 1;
257
+ this.setActiveComponentItem(this.contentItems[newActiveComponentIdx], false);
258
+ }
259
+ }
260
+ this._header.removeTab(componentItem);
261
+ super.removeChild(componentItem, keepChild);
262
+ if (!stackWillBeDeleted) {
263
+ this._header.updateClosability();
264
+ }
265
+ this.emitStateChangedEvent();
266
+ }
267
+ /**
268
+ * Maximises the Item or minimises it if it is already maximised
269
+ */
270
+ toggleMaximise() {
271
+ if (this.isMaximised) {
272
+ this.minimise();
273
+ }
274
+ else {
275
+ this.maximise();
276
+ }
277
+ }
278
+ maximise() {
279
+ if (!this.isMaximised) {
280
+ this.layoutManager.setMaximisedStack(this);
281
+ const contentItems = this.contentItems;
282
+ const contentItemCount = contentItems.length;
283
+ for (let i = 0; i < contentItemCount; i++) {
284
+ const contentItem = contentItems[i];
285
+ if (contentItem instanceof ComponentItem) {
286
+ contentItem.enterStackMaximised();
287
+ }
288
+ else {
289
+ throw new AssertError('SMAXI87773');
290
+ }
291
+ }
292
+ this.emitStateChangedEvent();
293
+ }
294
+ }
295
+ minimise() {
296
+ if (this.isMaximised) {
297
+ this.layoutManager.setMaximisedStack(undefined);
298
+ const contentItems = this.contentItems;
299
+ const contentItemCount = contentItems.length;
300
+ for (let i = 0; i < contentItemCount; i++) {
301
+ const contentItem = contentItems[i];
302
+ if (contentItem instanceof ComponentItem) {
303
+ contentItem.exitStackMaximised();
304
+ }
305
+ else {
306
+ throw new AssertError('SMINI87773');
307
+ }
308
+ }
309
+ this.emitStateChangedEvent();
310
+ }
311
+ }
312
+ /** @internal */
313
+ destroy() {
314
+ var _a;
315
+ if ((_a = this._activeComponentItem) === null || _a === void 0 ? void 0 : _a.focused) {
316
+ this._activeComponentItem.blur();
317
+ }
318
+ super.destroy();
319
+ this.off('resize', this._resizeListener);
320
+ if (this._maximisedEnabled) {
321
+ this.off('maximised', this._maximisedListener);
322
+ this.off('minimised', this._minimisedListener);
323
+ }
324
+ this._header.destroy();
325
+ }
326
+ toConfig() {
327
+ let activeItemIndex;
328
+ if (this._activeComponentItem) {
329
+ activeItemIndex = this.contentItems.indexOf(this._activeComponentItem);
330
+ if (activeItemIndex < 0) {
331
+ throw new Error('active component item not found in stack');
332
+ }
333
+ }
334
+ if (this.contentItems.length > 0 && activeItemIndex === undefined) {
335
+ throw new Error('expected non-empty stack to have an active component item');
336
+ }
337
+ else {
338
+ const result = {
339
+ type: 'stack',
340
+ content: this.calculateConfigContent(),
341
+ size: this.size,
342
+ sizeUnit: this.sizeUnit,
343
+ minSize: this.minSize,
344
+ minSizeUnit: this.minSizeUnit,
345
+ id: this.id,
346
+ isClosable: this.isClosable,
347
+ maximised: this.isMaximised,
348
+ header: this.createHeaderConfig(),
349
+ activeItemIndex,
350
+ };
351
+ return result;
352
+ }
353
+ }
354
+ /**
355
+ * Ok, this one is going to be the tricky one: The user has dropped a {@link (ContentItem:class)} onto this stack.
356
+ *
357
+ * It was dropped on either the stacks header or the top, right, bottom or left bit of the content area
358
+ * (which one of those is stored in this._dropSegment). Now, if the user has dropped on the header the case
359
+ * is relatively clear: We add the item to the existing stack... job done (might be good to have
360
+ * tab reordering at some point, but lets not sweat it right now)
361
+ *
362
+ * If the item was dropped on the content part things are a bit more complicated. If it was dropped on either the
363
+ * top or bottom region we need to create a new column and place the items accordingly.
364
+ * Unless, of course if the stack is already within a column... in which case we want
365
+ * to add the newly created item to the existing column...
366
+ * either prepend or append it, depending on wether its top or bottom.
367
+ *
368
+ * Same thing for rows and left / right drop segments... so in total there are 9 things that can potentially happen
369
+ * (left, top, right, bottom) * is child of the right parent (row, column) + header drop
370
+ *
371
+ * @internal
372
+ */
373
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
374
+ onDrop(contentItem, area) {
375
+ /*
376
+ * The item was dropped on the header area. Just add it as a child of this stack and
377
+ * get the hell out of this logic
378
+ */
379
+ if (this._dropSegment === "header" /* Stack.Segment.Header */) {
380
+ this.resetHeaderDropZone();
381
+ if (this._dropIndex === undefined) {
382
+ throw new UnexpectedUndefinedError('SODDI68990');
383
+ }
384
+ else {
385
+ this.addChild(contentItem, this._dropIndex);
386
+ return;
387
+ }
388
+ }
389
+ /*
390
+ * The stack is empty. Let's just add the element.
391
+ */
392
+ if (this._dropSegment === "body" /* Stack.Segment.Body */) {
393
+ this.addChild(contentItem, 0, true);
394
+ return;
395
+ }
396
+ /*
397
+ * The item was dropped on the top-, left-, bottom- or right- part of the content. Let's
398
+ * aggregate some conditions to make the if statements later on more readable
399
+ */
400
+ const isVertical = this._dropSegment === "top" /* Stack.Segment.Top */ || this._dropSegment === "bottom" /* Stack.Segment.Bottom */;
401
+ const isHorizontal = this._dropSegment === "left" /* Stack.Segment.Left */ || this._dropSegment === "right" /* Stack.Segment.Right */;
402
+ const insertBefore = this._dropSegment === "top" /* Stack.Segment.Top */ || this._dropSegment === "left" /* Stack.Segment.Left */;
403
+ const hasCorrectParent = (isVertical && this.stackParent.isColumn) || (isHorizontal && this.stackParent.isRow);
404
+ /*
405
+ * The content item can be either a component or a stack. If it is a component, wrap it into a stack
406
+ */
407
+ if (contentItem.isComponent) {
408
+ const itemConfig = ResolvedStackItemConfig.createDefault();
409
+ itemConfig.header = this.createHeaderConfig();
410
+ const stack = this.layoutManager.createAndInitContentItem(itemConfig, this);
411
+ stack.addChild(contentItem);
412
+ contentItem = stack;
413
+ }
414
+ /*
415
+ * If the contentItem that's being dropped is not dropped on a Stack (cases which just passed above and
416
+ * which would wrap the contentItem in a Stack) we need to check whether contentItem is a RowOrColumn.
417
+ * If it is, we need to re-wrap it in a Stack like it was when it was dragged by its Tab (it was dragged!).
418
+ */
419
+ if (contentItem.type === ItemType.row || contentItem.type === ItemType.column) {
420
+ const itemConfig = ResolvedStackItemConfig.createDefault();
421
+ itemConfig.header = this.createHeaderConfig();
422
+ const stack = this.layoutManager.createContentItem(itemConfig, this);
423
+ stack.addChild(contentItem);
424
+ contentItem = stack;
425
+ }
426
+ /*
427
+ * If the item is dropped on top or bottom of a column or left and right of a row, it's already
428
+ * layd out in the correct way. Just add it as a child
429
+ */
430
+ if (hasCorrectParent) {
431
+ const index = this.stackParent.contentItems.indexOf(this);
432
+ this.stackParent.addChild(contentItem, insertBefore ? index : index + 1, true);
433
+ this.size *= 0.5;
434
+ contentItem.size = this.size;
435
+ contentItem.sizeUnit = this.sizeUnit;
436
+ this.stackParent.updateSize(false);
437
+ /*
438
+ * This handles items that are dropped on top or bottom of a row or left / right of a column. We need
439
+ * to create the appropriate contentItem for them to live in
440
+ */
441
+ }
442
+ else {
443
+ const type = isVertical ? ItemType.column : ItemType.row;
444
+ const itemConfig = ResolvedItemConfig.createDefault(type);
445
+ const rowOrColumn = this.layoutManager.createContentItem(itemConfig, this);
446
+ this.stackParent.replaceChild(this, rowOrColumn);
447
+ rowOrColumn.addChild(contentItem, insertBefore ? 0 : undefined, true);
448
+ rowOrColumn.addChild(this, insertBefore ? undefined : 0, true);
449
+ this.size = 50;
450
+ contentItem.size = 50;
451
+ contentItem.sizeUnit = SizeUnitEnum.Percent;
452
+ rowOrColumn.updateSize(false);
453
+ }
454
+ }
455
+ /**
456
+ * If the user hovers above the header part of the stack, indicate drop positions for tabs.
457
+ * otherwise indicate which segment of the body the dragged item would be dropped on
458
+ *
459
+ * @param x - Absolute Screen X
460
+ * @param y - Absolute Screen Y
461
+ * @internal
462
+ */
463
+ highlightDropZone(x, y) {
464
+ for (const key in this._contentAreaDimensions) {
465
+ const segment = key;
466
+ const area = this._contentAreaDimensions[segment].hoverArea;
467
+ if (area.x1 < x && area.x2 > x && area.y1 < y && area.y2 > y) {
468
+ if (segment === "header" /* Stack.Segment.Header */) {
469
+ this._dropSegment = "header" /* Stack.Segment.Header */;
470
+ this.highlightHeaderDropZone(this._header.leftRightSided ? y : x);
471
+ }
472
+ else {
473
+ this.resetHeaderDropZone();
474
+ this.highlightBodyDropZone(segment);
475
+ }
476
+ return;
477
+ }
478
+ }
479
+ }
480
+ /** @internal */
481
+ getArea() {
482
+ if (this.element.style.display === 'none') {
483
+ return null;
484
+ }
485
+ const headerArea = super.getElementArea(this._header.element);
486
+ const contentArea = super.getElementArea(this._childElementContainer);
487
+ if (headerArea === null || contentArea === null) {
488
+ throw new UnexpectedNullError('SGAHC13086');
489
+ }
490
+ const contentWidth = contentArea.x2 - contentArea.x1;
491
+ const contentHeight = contentArea.y2 - contentArea.y1;
492
+ this._contentAreaDimensions = {
493
+ header: {
494
+ hoverArea: {
495
+ x1: headerArea.x1,
496
+ y1: headerArea.y1,
497
+ x2: headerArea.x2,
498
+ y2: headerArea.y2
499
+ },
500
+ highlightArea: {
501
+ x1: headerArea.x1,
502
+ y1: headerArea.y1,
503
+ x2: headerArea.x2,
504
+ y2: headerArea.y2
505
+ }
506
+ }
507
+ };
508
+ /**
509
+ * Highlight the entire body if the stack is empty
510
+ */
511
+ if (this.contentItems.length === 0) {
512
+ this._contentAreaDimensions.body = {
513
+ hoverArea: {
514
+ x1: contentArea.x1,
515
+ y1: contentArea.y1,
516
+ x2: contentArea.x2,
517
+ y2: contentArea.y2
518
+ },
519
+ highlightArea: {
520
+ x1: contentArea.x1,
521
+ y1: contentArea.y1,
522
+ x2: contentArea.x2,
523
+ y2: contentArea.y2
524
+ }
525
+ };
526
+ return super.getElementArea(this.element);
527
+ }
528
+ else {
529
+ this._contentAreaDimensions.left = {
530
+ hoverArea: {
531
+ x1: contentArea.x1,
532
+ y1: contentArea.y1,
533
+ x2: contentArea.x1 + contentWidth * 0.25,
534
+ y2: contentArea.y2
535
+ },
536
+ highlightArea: {
537
+ x1: contentArea.x1,
538
+ y1: contentArea.y1,
539
+ x2: contentArea.x1 + contentWidth * 0.5,
540
+ y2: contentArea.y2
541
+ }
542
+ };
543
+ this._contentAreaDimensions.top = {
544
+ hoverArea: {
545
+ x1: contentArea.x1 + contentWidth * 0.25,
546
+ y1: contentArea.y1,
547
+ x2: contentArea.x1 + contentWidth * 0.75,
548
+ y2: contentArea.y1 + contentHeight * 0.5
549
+ },
550
+ highlightArea: {
551
+ x1: contentArea.x1,
552
+ y1: contentArea.y1,
553
+ x2: contentArea.x2,
554
+ y2: contentArea.y1 + contentHeight * 0.5
555
+ }
556
+ };
557
+ this._contentAreaDimensions.right = {
558
+ hoverArea: {
559
+ x1: contentArea.x1 + contentWidth * 0.75,
560
+ y1: contentArea.y1,
561
+ x2: contentArea.x2,
562
+ y2: contentArea.y2
563
+ },
564
+ highlightArea: {
565
+ x1: contentArea.x1 + contentWidth * 0.5,
566
+ y1: contentArea.y1,
567
+ x2: contentArea.x2,
568
+ y2: contentArea.y2
569
+ }
570
+ };
571
+ this._contentAreaDimensions.bottom = {
572
+ hoverArea: {
573
+ x1: contentArea.x1 + contentWidth * 0.25,
574
+ y1: contentArea.y1 + contentHeight * 0.5,
575
+ x2: contentArea.x1 + contentWidth * 0.75,
576
+ y2: contentArea.y2
577
+ },
578
+ highlightArea: {
579
+ x1: contentArea.x1,
580
+ y1: contentArea.y1 + contentHeight * 0.5,
581
+ x2: contentArea.x2,
582
+ y2: contentArea.y2
583
+ }
584
+ };
585
+ return super.getElementArea(this.element);
586
+ }
587
+ }
588
+ /**
589
+ * Programmatically operate with header position.
590
+ *
591
+ * @param position -
592
+ *
593
+ * @returns previous header position
594
+ * @internal
595
+ */
596
+ positionHeader(position) {
597
+ if (this._header.side !== position) {
598
+ this._header.setSide(position);
599
+ this._headerSideChanged = true;
600
+ this.setupHeaderPosition();
601
+ }
602
+ }
603
+ /** @internal */
604
+ updateNodeSize() {
605
+ if (this.element.style.display !== 'none') {
606
+ const content = getElementWidthAndHeight(this.element);
607
+ if (this._header.show) {
608
+ const dimension = this._header.leftRightSided ? WidthOrHeightPropertyName.width : WidthOrHeightPropertyName.height;
609
+ content[dimension] -= this.layoutManager.layoutConfig.dimensions.headerHeight;
610
+ }
611
+ this._childElementContainer.style.width = numberToPixels(content.width);
612
+ this._childElementContainer.style.height = numberToPixels(content.height);
613
+ for (let i = 0; i < this.contentItems.length; i++) {
614
+ this.contentItems[i].element.style.width = numberToPixels(content.width);
615
+ this.contentItems[i].element.style.height = numberToPixels(content.height);
616
+ }
617
+ this.emit('resize');
618
+ this.emitStateChangedEvent();
619
+ }
620
+ }
621
+ /** @internal */
622
+ highlightHeaderDropZone(x) {
623
+ const visibleTabsLength = this._header.lastVisibleTabIndex + 1;
624
+ const tabsContainerElement = this._header.tabsContainerElement;
625
+ const tabsContainerElementChildNodes = tabsContainerElement.childNodes;
626
+ // Create shallow copy of childNodes list, excluding DropPlaceHolder, as we will be modifying the childNodes list
627
+ const visibleTabElements = new Array(visibleTabsLength);
628
+ let tabIndex = 0;
629
+ let tabCount = 0;
630
+ while (tabCount < visibleTabsLength) {
631
+ const visibleTabElement = tabsContainerElementChildNodes[tabIndex++];
632
+ if (visibleTabElement !== this.layoutManager.tabDropPlaceholder) {
633
+ visibleTabElements[tabCount++] = visibleTabElement;
634
+ }
635
+ }
636
+ const dropTargetIndicator = this.layoutManager.dropTargetIndicator;
637
+ if (dropTargetIndicator === null) {
638
+ throw new UnexpectedNullError('SHHDZDTI97110');
639
+ }
640
+ let area;
641
+ // Empty stack
642
+ if (visibleTabsLength === 0) {
643
+ const headerRect = this._header.element.getBoundingClientRect();
644
+ const headerTop = headerRect.top + document.body.scrollTop;
645
+ const headerLeft = headerRect.left + document.body.scrollLeft;
646
+ area = {
647
+ x1: headerLeft,
648
+ x2: headerLeft + 100,
649
+ y1: headerTop + headerRect.height - 20,
650
+ y2: headerTop + headerRect.height,
651
+ };
652
+ this._dropIndex = 0;
653
+ }
654
+ else {
655
+ let tabIndex = 0;
656
+ // This indicates whether our cursor is exactly over a tab
657
+ let isAboveTab = false;
658
+ let tabTop;
659
+ let tabLeft;
660
+ let tabWidth;
661
+ let tabElement;
662
+ do {
663
+ tabElement = visibleTabElements[tabIndex];
664
+ const tabRect = tabElement.getBoundingClientRect();
665
+ const tabRectTop = tabRect.top + document.body.scrollTop;
666
+ const tabRectLeft = tabRect.left + document.body.scrollLeft;
667
+ if (this._header.leftRightSided) {
668
+ tabLeft = tabRectTop;
669
+ tabTop = tabRectLeft;
670
+ tabWidth = tabRect.height;
671
+ }
672
+ else {
673
+ tabLeft = tabRectLeft;
674
+ tabTop = tabRectTop;
675
+ tabWidth = tabRect.width;
676
+ }
677
+ if (x >= tabLeft && x < tabLeft + tabWidth) {
678
+ isAboveTab = true;
679
+ }
680
+ else {
681
+ tabIndex++;
682
+ }
683
+ } while (tabIndex < visibleTabsLength && !isAboveTab);
684
+ // If we're not above any tabs, or to the right of any tab, we are out of the area, so give up
685
+ if (isAboveTab === false && x < tabLeft) {
686
+ return;
687
+ }
688
+ const halfX = tabLeft + tabWidth / 2;
689
+ if (x < halfX) {
690
+ this._dropIndex = tabIndex;
691
+ tabElement.insertAdjacentElement('beforebegin', this.layoutManager.tabDropPlaceholder);
692
+ }
693
+ else {
694
+ this._dropIndex = Math.min(tabIndex + 1, visibleTabsLength);
695
+ tabElement.insertAdjacentElement('afterend', this.layoutManager.tabDropPlaceholder);
696
+ }
697
+ const tabDropPlaceholderRect = this.layoutManager.tabDropPlaceholder.getBoundingClientRect();
698
+ const tabDropPlaceholderRectTop = tabDropPlaceholderRect.top + document.body.scrollTop;
699
+ const tabDropPlaceholderRectLeft = tabDropPlaceholderRect.left + document.body.scrollLeft;
700
+ const tabDropPlaceholderRectWidth = tabDropPlaceholderRect.width;
701
+ if (this._header.leftRightSided) {
702
+ const placeHolderTop = tabDropPlaceholderRectTop;
703
+ area = {
704
+ x1: tabTop,
705
+ x2: tabTop + tabElement.clientHeight,
706
+ y1: placeHolderTop,
707
+ y2: placeHolderTop + tabDropPlaceholderRectWidth,
708
+ };
709
+ }
710
+ else {
711
+ const placeHolderLeft = tabDropPlaceholderRectLeft;
712
+ area = {
713
+ x1: placeHolderLeft,
714
+ x2: placeHolderLeft + tabDropPlaceholderRectWidth,
715
+ y1: tabTop,
716
+ y2: tabTop + tabElement.clientHeight,
717
+ };
718
+ }
719
+ }
720
+ dropTargetIndicator.highlightArea(area, 0);
721
+ return;
722
+ }
723
+ /** @internal */
724
+ resetHeaderDropZone() {
725
+ this.layoutManager.tabDropPlaceholder.remove();
726
+ }
727
+ /** @internal */
728
+ setupHeaderPosition() {
729
+ setElementDisplayVisibility(this._header.element, this._header.show);
730
+ this.element.classList.remove("lm_left" /* DomConstants.ClassName.Left */, "lm_right" /* DomConstants.ClassName.Right */, "lm_bottom" /* DomConstants.ClassName.Bottom */);
731
+ if (this._header.leftRightSided) {
732
+ this.element.classList.add('lm_' + this._header.side);
733
+ }
734
+ //if ([Side.right, Side.bottom].includes(this._header.side)) {
735
+ // // move the header behind the content.
736
+ // this.element.appendChild(this._header.element);
737
+ //}
738
+ this.updateSize(false);
739
+ }
740
+ /** @internal */
741
+ highlightBodyDropZone(segment) {
742
+ if (this._contentAreaDimensions === undefined) {
743
+ throw new UnexpectedUndefinedError('SHBDZC82265');
744
+ }
745
+ else {
746
+ const highlightArea = this._contentAreaDimensions[segment].highlightArea;
747
+ const dropTargetIndicator = this.layoutManager.dropTargetIndicator;
748
+ if (dropTargetIndicator === null) {
749
+ throw new UnexpectedNullError('SHBDZD96110');
750
+ }
751
+ else {
752
+ dropTargetIndicator.highlightArea(highlightArea, 1);
753
+ this._dropSegment = segment;
754
+ }
755
+ }
756
+ }
757
+ /** @internal */
758
+ handleResize() {
759
+ this._header.updateTabSizes();
760
+ }
761
+ /** @internal */
762
+ handleMaximised() {
763
+ this._header.processMaximised();
764
+ }
765
+ /** @internal */
766
+ handleMinimised() {
767
+ this._header.processMinimised();
768
+ }
769
+ /** @internal */
770
+ handlePopoutEvent() {
771
+ this.popout();
772
+ }
773
+ /** @internal */
774
+ handleHeaderClickEvent(ev) {
775
+ const eventName = EventEmitter.headerClickEventName;
776
+ const bubblingEvent = new EventEmitter.ClickBubblingEvent(eventName, this, ev);
777
+ this.emit(eventName, bubblingEvent);
778
+ }
779
+ /** @internal */
780
+ handleHeaderTouchStartEvent(ev) {
781
+ const eventName = EventEmitter.headerTouchStartEventName;
782
+ const bubblingEvent = new EventEmitter.TouchStartBubblingEvent(eventName, this, ev);
783
+ this.emit(eventName, bubblingEvent);
784
+ }
785
+ /** @internal */
786
+ handleHeaderComponentRemoveEvent(item) {
787
+ this.removeChild(item, false);
788
+ }
789
+ /** @internal */
790
+ handleHeaderComponentFocusEvent(item) {
791
+ this.setActiveComponentItem(item, true);
792
+ }
793
+ /** @internal */
794
+ handleHeaderComponentStartDragEvent(x, y, dragListener, componentItem) {
795
+ if (this.isMaximised === true) {
796
+ this.toggleMaximise();
797
+ }
798
+ this.layoutManager.startComponentDrag(x, y, dragListener, componentItem, this);
799
+ }
800
+ /** @internal */
801
+ createHeaderConfig() {
802
+ if (!this._headerSideChanged) {
803
+ return ResolvedHeaderedItemConfig.Header.createCopy(this._headerConfig);
804
+ }
805
+ else {
806
+ const show = this._header.show ? this._header.side : false;
807
+ let result = ResolvedHeaderedItemConfig.Header.createCopy(this._headerConfig, show);
808
+ if (result === undefined) {
809
+ result = {
810
+ show,
811
+ popout: undefined,
812
+ maximise: undefined,
813
+ close: undefined,
814
+ minimise: undefined,
815
+ tabDropdown: undefined,
816
+ };
817
+ }
818
+ return result;
819
+ }
820
+ }
821
+ /** @internal */
822
+ emitStateChangedEvent() {
823
+ this.emitBaseBubblingEvent('stateChanged');
824
+ }
825
+ }
826
+ /** @public */
827
+ (function (Stack) {
828
+ /** @internal */
829
+ function createElement(document) {
830
+ const element = document.createElement('div');
831
+ element.classList.add("lm_item" /* DomConstants.ClassName.Item */);
832
+ element.classList.add("lm_stack" /* DomConstants.ClassName.Stack */);
833
+ return element;
834
+ }
835
+ Stack.createElement = createElement;
836
+ })(Stack || (Stack = {}));
837
+ //# sourceMappingURL=stack.js.map