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