@datagrok-libraries/dock-spawn-dg 0.0.1

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 (222) hide show
  1. package/.eslintrc.json +47 -0
  2. package/CHANGELOG.md +355 -0
  3. package/LICENSE +21 -0
  4. package/README.md +11 -0
  5. package/css/dock-manager-context-menu.css +19 -0
  6. package/css/dock-manager-style.css +190 -0
  7. package/css/dock-manager.css +411 -0
  8. package/images/close.svg +6 -0
  9. package/images/dock_bottom.png +0 -0
  10. package/images/dock_bottom_sel.png +0 -0
  11. package/images/dock_fill.png +0 -0
  12. package/images/dock_fill_sel.png +0 -0
  13. package/images/dock_left.png +0 -0
  14. package/images/dock_left_sel.png +0 -0
  15. package/images/dock_right.png +0 -0
  16. package/images/dock_right_sel.png +0 -0
  17. package/images/dock_top.png +0 -0
  18. package/images/dock_top_sel.png +0 -0
  19. package/index.ts +32 -0
  20. package/lib/BrowserDialogHelper.d.ts +8 -0
  21. package/lib/BrowserDialogHelper.d.ts.map +1 -0
  22. package/lib/BrowserDialogHelper.js +60 -0
  23. package/lib/ContainerType.d.ts +7 -0
  24. package/lib/ContainerType.d.ts.map +1 -0
  25. package/lib/ContainerType.js +7 -0
  26. package/lib/Dialog.d.ts +51 -0
  27. package/lib/Dialog.d.ts.map +1 -0
  28. package/lib/Dialog.js +209 -0
  29. package/lib/DockConfig.d.ts +9 -0
  30. package/lib/DockConfig.d.ts.map +1 -0
  31. package/lib/DockConfig.js +14 -0
  32. package/lib/DockGraphDeserializer.d.ts +19 -0
  33. package/lib/DockGraphDeserializer.d.ts.map +1 -0
  34. package/lib/DockGraphDeserializer.js +114 -0
  35. package/lib/DockGraphSerializer.d.ts +14 -0
  36. package/lib/DockGraphSerializer.d.ts.map +1 -0
  37. package/lib/DockGraphSerializer.js +40 -0
  38. package/lib/DockLayoutEngine.d.ts +36 -0
  39. package/lib/DockLayoutEngine.d.ts.map +1 -0
  40. package/lib/DockLayoutEngine.js +323 -0
  41. package/lib/DockManager.d.ts +155 -0
  42. package/lib/DockManager.d.ts.map +1 -0
  43. package/lib/DockManager.js +752 -0
  44. package/lib/DockManagerContext.d.ts +10 -0
  45. package/lib/DockManagerContext.d.ts.map +1 -0
  46. package/lib/DockManagerContext.js +12 -0
  47. package/lib/DockModel.d.ts +9 -0
  48. package/lib/DockModel.d.ts.map +1 -0
  49. package/lib/DockModel.js +8 -0
  50. package/lib/DockNode.d.ts +16 -0
  51. package/lib/DockNode.d.ts.map +1 -0
  52. package/lib/DockNode.js +64 -0
  53. package/lib/DockWheel.d.ts +41 -0
  54. package/lib/DockWheel.d.ts.map +1 -0
  55. package/lib/DockWheel.js +208 -0
  56. package/lib/DockWheelItem.d.ts +16 -0
  57. package/lib/DockWheelItem.d.ts.map +1 -0
  58. package/lib/DockWheelItem.js +34 -0
  59. package/lib/DocumentManagerContainer.d.ts +16 -0
  60. package/lib/DocumentManagerContainer.d.ts.map +1 -0
  61. package/lib/DocumentManagerContainer.js +28 -0
  62. package/lib/DocumentTabPage.d.ts +11 -0
  63. package/lib/DocumentTabPage.d.ts.map +1 -0
  64. package/lib/DocumentTabPage.js +26 -0
  65. package/lib/DraggableContainer.d.ts +51 -0
  66. package/lib/DraggableContainer.d.ts.map +1 -0
  67. package/lib/DraggableContainer.js +145 -0
  68. package/lib/EventHandler.d.ts +8 -0
  69. package/lib/EventHandler.d.ts.map +1 -0
  70. package/lib/EventHandler.js +14 -0
  71. package/lib/FillDockContainer.d.ts +34 -0
  72. package/lib/FillDockContainer.d.ts.map +1 -0
  73. package/lib/FillDockContainer.js +80 -0
  74. package/lib/HorizontalDockContainer.d.ts +7 -0
  75. package/lib/HorizontalDockContainer.d.ts.map +1 -0
  76. package/lib/HorizontalDockContainer.js +9 -0
  77. package/lib/PanelContainer.d.ts +114 -0
  78. package/lib/PanelContainer.d.ts.map +1 -0
  79. package/lib/PanelContainer.js +517 -0
  80. package/lib/Point.d.ts +6 -0
  81. package/lib/Point.d.ts.map +1 -0
  82. package/lib/Point.js +8 -0
  83. package/lib/ResizableContainer.d.ts +56 -0
  84. package/lib/ResizableContainer.d.ts.map +1 -0
  85. package/lib/ResizableContainer.js +254 -0
  86. package/lib/ResizeHandle.d.ts +16 -0
  87. package/lib/ResizeHandle.d.ts.map +1 -0
  88. package/lib/ResizeHandle.js +58 -0
  89. package/lib/SplitterBar.d.ts +33 -0
  90. package/lib/SplitterBar.d.ts.map +1 -0
  91. package/lib/SplitterBar.js +137 -0
  92. package/lib/SplitterDockContainer.d.ts +36 -0
  93. package/lib/SplitterDockContainer.d.ts.map +1 -0
  94. package/lib/SplitterDockContainer.js +75 -0
  95. package/lib/SplitterPanel.d.ts +27 -0
  96. package/lib/SplitterPanel.d.ts.map +1 -0
  97. package/lib/SplitterPanel.js +195 -0
  98. package/lib/TabHandle.d.ts +56 -0
  99. package/lib/TabHandle.d.ts.map +1 -0
  100. package/lib/TabHandle.js +292 -0
  101. package/lib/TabHost.d.ts +47 -0
  102. package/lib/TabHost.d.ts.map +1 -0
  103. package/lib/TabHost.js +238 -0
  104. package/lib/TabPage.d.ts +20 -0
  105. package/lib/TabPage.d.ts.map +1 -0
  106. package/lib/TabPage.js +81 -0
  107. package/lib/UndockInitiator.d.ts +32 -0
  108. package/lib/UndockInitiator.d.ts.map +1 -0
  109. package/lib/UndockInitiator.js +152 -0
  110. package/lib/Utils.d.ts +15 -0
  111. package/lib/Utils.d.ts.map +1 -0
  112. package/lib/Utils.js +69 -0
  113. package/lib/VerticalDockContainer.d.ts +7 -0
  114. package/lib/VerticalDockContainer.d.ts.map +1 -0
  115. package/lib/VerticalDockContainer.js +9 -0
  116. package/lib/enums/PanelType.d.ts +5 -0
  117. package/lib/enums/PanelType.d.ts.map +1 -0
  118. package/lib/enums/PanelType.js +5 -0
  119. package/lib/enums/TabHostDirection.d.ts +7 -0
  120. package/lib/enums/TabHostDirection.d.ts.map +1 -0
  121. package/lib/enums/TabHostDirection.js +7 -0
  122. package/lib/enums/WheelTypes.d.ts +12 -0
  123. package/lib/enums/WheelTypes.d.ts.map +1 -0
  124. package/lib/enums/WheelTypes.js +14 -0
  125. package/lib/i18n/Defaults.d.ts +12 -0
  126. package/lib/i18n/Defaults.d.ts.map +1 -0
  127. package/lib/i18n/Defaults.js +9 -0
  128. package/lib/i18n/Localizer.d.ts +7 -0
  129. package/lib/i18n/Localizer.d.ts.map +1 -0
  130. package/lib/i18n/Localizer.js +16 -0
  131. package/lib/index.d.ts +33 -0
  132. package/lib/index.d.ts.map +1 -0
  133. package/lib/index.js +32 -0
  134. package/lib/interfaces/IDockContainer.d.ts +26 -0
  135. package/lib/interfaces/IDockContainer.d.ts.map +1 -0
  136. package/lib/interfaces/IDockContainer.js +1 -0
  137. package/lib/interfaces/IDockContainerWithSize.d.ts +6 -0
  138. package/lib/interfaces/IDockContainerWithSize.d.ts.map +1 -0
  139. package/lib/interfaces/IDockContainerWithSize.js +1 -0
  140. package/lib/interfaces/ILayoutEventListener.d.ts +27 -0
  141. package/lib/interfaces/ILayoutEventListener.d.ts.map +1 -0
  142. package/lib/interfaces/ILayoutEventListener.js +1 -0
  143. package/lib/interfaces/IMouseOrTouchEvent.d.ts +7 -0
  144. package/lib/interfaces/IMouseOrTouchEvent.d.ts.map +1 -0
  145. package/lib/interfaces/IMouseOrTouchEvent.js +1 -0
  146. package/lib/interfaces/INodeInfo.d.ts +8 -0
  147. package/lib/interfaces/INodeInfo.d.ts.map +1 -0
  148. package/lib/interfaces/INodeInfo.js +1 -0
  149. package/lib/interfaces/IPanelInfo.d.ts +10 -0
  150. package/lib/interfaces/IPanelInfo.d.ts.map +1 -0
  151. package/lib/interfaces/IPanelInfo.js +1 -0
  152. package/lib/interfaces/IRectangle.d.ts +7 -0
  153. package/lib/interfaces/IRectangle.d.ts.map +1 -0
  154. package/lib/interfaces/IRectangle.js +1 -0
  155. package/lib/interfaces/ISize.d.ts +5 -0
  156. package/lib/interfaces/ISize.d.ts.map +1 -0
  157. package/lib/interfaces/ISize.js +1 -0
  158. package/lib/interfaces/IState.d.ts +12 -0
  159. package/lib/interfaces/IState.d.ts.map +1 -0
  160. package/lib/interfaces/IState.js +1 -0
  161. package/lib/interfaces/IThickness.d.ts +7 -0
  162. package/lib/interfaces/IThickness.d.ts.map +1 -0
  163. package/lib/interfaces/IThickness.js +1 -0
  164. package/lib/webcomponent/DockSpawnTsWebcomponent.d.ts +35 -0
  165. package/lib/webcomponent/DockSpawnTsWebcomponent.d.ts.map +1 -0
  166. package/lib/webcomponent/DockSpawnTsWebcomponent.js +209 -0
  167. package/lib/webcomponent/styles.d.ts +5 -0
  168. package/lib/webcomponent/styles.d.ts.map +1 -0
  169. package/lib/webcomponent/styles.js +537 -0
  170. package/package.json +36 -0
  171. package/src/BrowserDialogHelper.ts +76 -0
  172. package/src/ContainerType.ts +6 -0
  173. package/src/Dialog.ts +253 -0
  174. package/src/DockConfig.ts +15 -0
  175. package/src/DockGraphDeserializer.ts +129 -0
  176. package/src/DockGraphSerializer.ts +53 -0
  177. package/src/DockLayoutEngine.ts +370 -0
  178. package/src/DockManager.ts +880 -0
  179. package/src/DockManagerContext.ts +16 -0
  180. package/src/DockModel.ts +12 -0
  181. package/src/DockNode.ts +81 -0
  182. package/src/DockWheel.ts +215 -0
  183. package/src/DockWheelItem.ts +41 -0
  184. package/src/DocumentManagerContainer.ts +39 -0
  185. package/src/DocumentTabPage.ts +35 -0
  186. package/src/DraggableContainer.ts +177 -0
  187. package/src/EventHandler.ts +17 -0
  188. package/src/FillDockContainer.ts +98 -0
  189. package/src/HorizontalDockContainer.ts +13 -0
  190. package/src/PanelContainer.ts +596 -0
  191. package/src/Point.ts +10 -0
  192. package/src/ResizableContainer.ts +293 -0
  193. package/src/ResizeHandle.ts +59 -0
  194. package/src/SplitterBar.ts +157 -0
  195. package/src/SplitterDockContainer.ts +95 -0
  196. package/src/SplitterPanel.ts +228 -0
  197. package/src/TabHandle.ts +347 -0
  198. package/src/TabHost.ts +267 -0
  199. package/src/TabPage.ts +98 -0
  200. package/src/UndockInitiator.ts +181 -0
  201. package/src/Utils.ts +85 -0
  202. package/src/VerticalDockContainer.ts +13 -0
  203. package/src/enums/PanelType.ts +4 -0
  204. package/src/enums/TabHostDirection.ts +6 -0
  205. package/src/enums/WheelTypes.ts +14 -0
  206. package/src/i18n/Defaults.ts +20 -0
  207. package/src/i18n/Localizer.ts +23 -0
  208. package/src/index.ts +32 -0
  209. package/src/interfaces/IDockContainer.ts +27 -0
  210. package/src/interfaces/IDockContainerWithSize.ts +6 -0
  211. package/src/interfaces/ILayoutEventListener.ts +28 -0
  212. package/src/interfaces/IMouseOrTouchEvent.ts +6 -0
  213. package/src/interfaces/INodeInfo.ts +8 -0
  214. package/src/interfaces/IPanelInfo.ts +10 -0
  215. package/src/interfaces/IRectangle.ts +6 -0
  216. package/src/interfaces/ISize.ts +4 -0
  217. package/src/interfaces/IState.ts +12 -0
  218. package/src/interfaces/IThickness.ts +6 -0
  219. package/src/webcomponent/DockSpawnTsWebcomponent.ts +248 -0
  220. package/src/webcomponent/styles.ts +544 -0
  221. package/tsconfig.json +74 -0
  222. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1,23 @@
1
+ import { Defaults, GetLocalizerParameters, TranslationKey } from "./Defaults.js";
2
+
3
+ function formatString(template: string, ...params: any[]): string {
4
+ return template.replace(/{(\d+)}/g, (_match: string, n: string) => {
5
+ const index = Number.parseInt(n);
6
+ return params[index].toString();
7
+ });
8
+ }
9
+
10
+ export class Localizer {
11
+ public static configure(getTemplateString: (key: TranslationKey) => string | null): void {
12
+ Localizer._getTemplateString = getTemplateString;
13
+ }
14
+
15
+ public static getString<K extends TranslationKey>(key: K, ...params: GetLocalizerParameters<K>): string {
16
+ return formatString(
17
+ Localizer._getTemplateString?.(key) ?? Defaults[key],
18
+ ...params
19
+ );
20
+ }
21
+
22
+ private static _getTemplateString?: (key: TranslationKey) => string | null;
23
+ }
package/src/index.ts ADDED
@@ -0,0 +1,32 @@
1
+ export * from './ContainerType';
2
+ export * from './Dialog';
3
+ export * from './DockConfig';
4
+ export * from './DockGraphSerializer';
5
+ export * from './DockLayoutEngine';
6
+ export * from './DockManager';
7
+ export * from './DockManagerContext';
8
+ export * from './DockModel';
9
+ export * from './DockNode';
10
+ export * from './DockWheel';
11
+ export * from './DockWheelItem';
12
+ export * from './DocumentManagerContainer';
13
+ export * from './DocumentTabPage';
14
+ export * from './DraggableContainer';
15
+ export * from './EventHandler';
16
+ export * from './FillDockContainer';
17
+ export * from './HorizontalDockContainer';
18
+ export * from './PanelContainer';
19
+ export * from './Point';
20
+ export * from './ResizableContainer';
21
+ export * from './ResizeHandle';
22
+ export * from './SplitterBar';
23
+ export * from './SplitterDockContainer';
24
+ export * from './SplitterPanel';
25
+ export * from './TabHandle';
26
+ export * from './TabHost';
27
+ export * from './TabPage';
28
+ export * from './UndockInitiator';
29
+ export * from './Utils';
30
+ export * from './VerticalDockContainer';
31
+ export * from './i18n/Localizer';
32
+ export * from './webcomponent/DockSpawnTsWebcomponent';
@@ -0,0 +1,27 @@
1
+ import { ContainerType } from "../ContainerType.js";
2
+ import { DockManager } from "../DockManager.js";
3
+ import { IState } from "./IState.js";
4
+ import { TabPage } from '../TabPage.js';
5
+
6
+ export interface IDockContainer {
7
+ readonly dockManager: DockManager;
8
+ resize(_width: number, _height: number): void;
9
+ performLayout(children: IDockContainer[], relayoutEvenIfEqual : boolean): void;
10
+ destroy(): void;
11
+ setActiveChild(child: IDockContainer): void;
12
+ saveState(state: IState): void;
13
+ loadState(state: IState): void;
14
+ readonly containerElement: HTMLElement;
15
+ containerType: ContainerType;
16
+ readonly width: number;
17
+ readonly height: number;
18
+ name: string;
19
+ tabPage?: TabPage;
20
+
21
+ /**
22
+ * Indicates the minimum allowed child nodes a composite dock panel can have
23
+ * If it's children fall below this value, the composite panel is destroyed
24
+ * and it's children are moved one level up
25
+ */
26
+ readonly minimumAllowedChildNodes: number;
27
+ }
@@ -0,0 +1,6 @@
1
+ import { ISize } from "./ISize.js";
2
+ import { IDockContainer } from "./IDockContainer.js";
3
+
4
+ export interface IDockContainerWithSize extends IDockContainer {
5
+ state: ISize;
6
+ }
@@ -0,0 +1,28 @@
1
+ import { DockManager } from "../DockManager.js";
2
+ import { DockNode } from "../DockNode.js";
3
+ import { Dialog } from "../Dialog.js";
4
+ import { TabPage } from "../TabPage.js";
5
+ import { IDockContainer } from "./IDockContainer.js";
6
+ import { PanelContainer } from "../PanelContainer.js";
7
+
8
+ export interface ILayoutEventListener {
9
+ onDock?(dockManager: DockManager, dockNode: DockNode): void;
10
+ onTabsReorder?(dockManager: DockManager, dockNode: DockNode): void;
11
+ onUndock?(dockManager: DockManager, dockNode: DockNode): void;
12
+ onClosePanel?(dockManager: DockManager, panel: PanelContainer): void;
13
+ onCreateDialog?(dockManager: DockManager, dialog: Dialog): void;
14
+ onHideDialog?(dockManager: DockManager, dialog: Dialog): void;
15
+ onShowDialog?(dockManager: DockManager, dialog: Dialog): void;
16
+ onChangeDialogPosition?(dockManager: DockManager, dialog: Dialog, x: number, y: number): void;
17
+ onContainerResized?(dockManager: DockManager, dockContainer: IDockContainer): void;
18
+ onTabChanged?(dockManager: DockManager, tabpage: TabPage): void;
19
+ onActivePanelChange?(dockManager: DockManager, panel?: PanelContainer, previousPanel?: PanelContainer): void;
20
+ onActiveDocumentChange?(dockManager: DockManager, panel?: PanelContainer, previousPanel?: PanelContainer): void;
21
+
22
+ /**
23
+ * The Dock Manager notifies the listeners of layout changes so client containers that have
24
+ * costly layout structures can detach and reattach themself to avoid reflow
25
+ */
26
+ onSuspendLayout?(dockManager: DockManager, panel: IDockContainer): void;
27
+ onResumeLayout?(dockManager: DockManager, panel: IDockContainer): void;
28
+ }
@@ -0,0 +1,6 @@
1
+ export interface IMouseOrTouchEvent {
2
+ clientX: number;
3
+ clientY: number;
4
+ changedTouches?: IMouseOrTouchEvent[];
5
+ touches?: IMouseOrTouchEvent[];
6
+ }
@@ -0,0 +1,8 @@
1
+ import { ContainerType } from "../ContainerType.js";
2
+ import { IState } from "./IState.js";
3
+
4
+ export interface INodeInfo {
5
+ containerType: ContainerType;
6
+ state: IState;
7
+ children: INodeInfo[];
8
+ }
@@ -0,0 +1,10 @@
1
+ import { ContainerType } from "../ContainerType.js";
2
+ import { Point } from "../Point.js";
3
+ import { IState } from "./IState.js";
4
+
5
+ export interface IPanelInfo {
6
+ containerType: ContainerType;
7
+ state: IState;
8
+ position: Point;
9
+ isHidden: boolean;
10
+ }
@@ -0,0 +1,6 @@
1
+ export interface IRectangle {
2
+ x?: number;
3
+ y?: number;
4
+ width?: number;
5
+ height?: number;
6
+ }
@@ -0,0 +1,4 @@
1
+ export interface ISize {
2
+ width?: number;
3
+ height?: number;
4
+ }
@@ -0,0 +1,12 @@
1
+ import { PanelType } from "../enums/PanelType";
2
+
3
+ export interface IState {
4
+ width?: number;
5
+ height?: number;
6
+ documentManager?: boolean;
7
+ element?: string;
8
+ canUndock?: boolean;
9
+ hideCloseButton?: boolean;
10
+ panelType?: PanelType;
11
+ panelIcon?: string,
12
+ }
@@ -0,0 +1,6 @@
1
+ export interface IThickness {
2
+ left?: number;
3
+ top?: number;
4
+ width?: number;
5
+ height?: number;
6
+ }
@@ -0,0 +1,248 @@
1
+ import {DockManager} from '../DockManager.js';
2
+ import {PanelContainer} from '../PanelContainer.js';
3
+ import {PanelType} from '../enums/PanelType.js';
4
+ import {DockNode} from '../DockNode.js';
5
+ import {faStyle, style, style1, style2} from './styles';
6
+ import {Observable, Subscriber, Subscription} from 'rxjs';
7
+ import {debounceTime} from 'rxjs/operators';
8
+
9
+ const elementResized = (elem: Element) => {
10
+ return new Observable((subscriber: Subscriber<ResizeObserverEntry[]>) => {
11
+ const resizeObserver = new ResizeObserver(
12
+ (entries: ResizeObserverEntry[]) => subscriber.next(entries),
13
+ );
14
+
15
+ resizeObserver.observe(elem);
16
+
17
+ return () => resizeObserver.disconnect();
18
+ });
19
+ };
20
+
21
+ export class DockSpawnTsWebcomponent extends HTMLElement {
22
+ public dockManager: DockManager;
23
+ private slotId: number = 0;
24
+ private windowResizedBound;
25
+ private slotElementMap: WeakMap<HTMLSlotElement, HTMLElement>;
26
+ private observer: MutationObserver;
27
+ private resizeSub: Subscription;
28
+ private initialized = false;
29
+ private initFinished = false;
30
+ private elementContainerMap: Map<HTMLElement, PanelContainer> = new Map();
31
+
32
+ constructor() {
33
+ super();
34
+
35
+ const shadowRoot = this.attachShadow({mode: 'open'});
36
+ shadowRoot.adoptedStyleSheets = [style, style1, style2, faStyle];
37
+
38
+ this.windowResizedBound = this.windowResized.bind(this);
39
+ this.slotElementMap = new WeakMap();
40
+ }
41
+
42
+ public getLayout() {
43
+ return this.dockManager.saveState();
44
+ }
45
+
46
+ public async useLayout(serializedState: string) {
47
+ this.observer.disconnect();
48
+ const oldPanels = this.dockManager.getPanels();
49
+ await this.dockManager.loadState(serializedState);
50
+ this.observer.observe(this, {childList: true});
51
+ oldPanels.forEach((panel) => panel.elementContentContainer.remove());
52
+ this.dockManager.element.firstChild.remove();
53
+ setTimeout(() => {
54
+ this.dockManager.invalidate();
55
+ }, 50)
56
+ }
57
+
58
+ private initDockspawn() {
59
+ const dockSpawnDiv = document.createElement('div');
60
+ dockSpawnDiv.id = 'dockSpawnDiv';
61
+ dockSpawnDiv.style.width = '100%';
62
+ dockSpawnDiv.style.height = '100%';
63
+ dockSpawnDiv.style.position = 'relative';
64
+ this.shadowRoot.appendChild(dockSpawnDiv);
65
+
66
+ this.dockManager = new DockManager(dockSpawnDiv);
67
+ this.dockManager.config.dialogRootElement = dockSpawnDiv;
68
+
69
+ setTimeout(() => {
70
+ this.dockManager.initialize();
71
+
72
+ this.dockManager.addLayoutListener({
73
+ onActivePanelChange: (_, panel, prevPanel) => {
74
+ this.dispatchEvent(new CustomEvent('active-panel-changed', {detail: {
75
+ newPanel: panel?.title ?? null,
76
+ prevPanel: prevPanel?.title ?? null
77
+ }}));
78
+ },
79
+ onClosePanel: (dockManager, dockNode) => {
80
+ const slot = dockNode.elementContent as any as HTMLSlotElement;
81
+ const element = this.slotElementMap.get(slot);
82
+ if (element) {
83
+ if (this.contains(element)) {
84
+ this.observer.disconnect();
85
+ this.removeChild(element);
86
+ this.observer.observe(this, {childList: true});
87
+ }
88
+ this.dispatchEvent(new CustomEvent('panel-closed', {detail: element}));
89
+ }
90
+ },
91
+ });
92
+
93
+ for (const element of this.children)
94
+ this.handleAddedChildNode(element as HTMLElement);
95
+
96
+ this.observer = new MutationObserver((mutations) => {
97
+ mutations.forEach((mutation) => {
98
+ mutation.addedNodes.forEach((node) => {
99
+ this.handleAddedChildNode(node as HTMLElement);
100
+ });
101
+ mutation.removedNodes.forEach((node) => {
102
+ this.handleRemovedChildNode(node as HTMLElement);
103
+ });
104
+ });
105
+ });
106
+ this.observer.observe(this, {childList: true});
107
+
108
+ this.resizeSub = elementResized(this).pipe(debounceTime(50)).subscribe(() => this.resize());
109
+
110
+ this.initFinished = true;
111
+ this.dispatchEvent(new CustomEvent('init-finished'));
112
+ }, 50);
113
+ }
114
+
115
+ public set activePanelTitle(panelTitle: string) {
116
+ const foundPanel = this.dockManager?.getPanels().find((panel) => panel.title === panelTitle);
117
+ if (foundPanel)
118
+ this.dockManager.activePanel = foundPanel;
119
+ }
120
+
121
+ public getElementInSlot(slot: HTMLSlotElement): HTMLElement {
122
+ return this.slotElementMap.get(slot);
123
+ }
124
+
125
+ private handleAddedChildNode(element: HTMLElement) {
126
+ if (element instanceof Comment || (element instanceof Text && element.textContent.length === 0)) return;
127
+
128
+ const slot = document.createElement('slot');
129
+ const slotName = 'slot_' + this.slotId++;
130
+ slot.name = slotName;
131
+
132
+ let dockPanelType = PanelType.panel;
133
+ const dockPanelTypeAttribute = element.getAttribute('dock-spawn-panel-type');
134
+ if (dockPanelTypeAttribute)
135
+ dockPanelType = <PanelType><any>dockPanelTypeAttribute;
136
+ const hideCloseButton = element.hasAttribute('dock-spawn-hide-close-button');
137
+ const title = element.getAttribute('dock-spawn-title');
138
+ const panelIcon = element.getAttribute('dock-spawn-panel-icon');
139
+ const container = new PanelContainer(slot, this.dockManager, title, dockPanelType, hideCloseButton, panelIcon);
140
+ const customZindex = element.getAttribute('dock-spawn-z-index');
141
+ if (customZindex && slot.parentElement) {
142
+ slot.parentElement.style.zIndex = customZindex;
143
+ }
144
+ element.slot = slotName;
145
+ this.slotElementMap.set(slot, (<HTMLElement>element));
146
+ this.elementContainerMap.set(element, container);
147
+
148
+ let dockRatio: number = 0.5;
149
+ const dockRatioAttribute = element.getAttribute('dock-spawn-dock-ratio');
150
+ if (dockRatioAttribute)
151
+ dockRatio = <number><any>dockRatioAttribute;
152
+ const dockType = element.getAttribute('dock-spawn-dock-type');
153
+
154
+ let dockRelativeTo = this.dockManager.context.model.documentManagerNode;
155
+ const dockToAttribute = element.getAttribute('dock-spawn-dock-to');
156
+ if (dockToAttribute) {
157
+ const dockToElement = (this.getRootNode() as HTMLElement)
158
+ .querySelector(`[dock-spawn-title="${dockToAttribute}"]`) as HTMLElement | null;
159
+ if (dockToElement && this.elementContainerMap.get(dockToElement)) {
160
+ dockRelativeTo = this.dockManager
161
+ .findNodeFromContainerElement(this.elementContainerMap.get(dockToElement).containerElement);
162
+ }
163
+ }
164
+
165
+ if (dockType == 'left')
166
+ this.dockManager.dockLeft(dockRelativeTo, container, dockRatio);
167
+ else if (dockType == 'right')
168
+ this.dockManager.dockRight(dockRelativeTo, container, dockRatio);
169
+ else if (dockType == 'up')
170
+ this.dockManager.dockUp(dockRelativeTo, container, dockRatio);
171
+ else if (dockType == 'down')
172
+ this.dockManager.dockDown(dockRelativeTo, container, dockRatio);
173
+ else
174
+ this.dockManager.dockFill(dockRelativeTo, container);
175
+
176
+ if ((<HTMLElement>element).style.display == 'none')
177
+ (<HTMLElement>element).style.display = 'block';
178
+ }
179
+
180
+ private handleRemovedChildNode(element: HTMLElement) {
181
+ const node = this.elementContainerMap.get(element);
182
+ if (node)
183
+ node.close();
184
+ this.elementContainerMap.delete(element);
185
+ }
186
+
187
+ connectedCallback() {
188
+ if (!this.initialized) {
189
+ this.initDockspawn();
190
+ this.initialized = true;
191
+ }
192
+ window.addEventListener('orientationchange', this.windowResizedBound);
193
+ if (this.initFinished) this.resize();
194
+ }
195
+
196
+ disconnectedCallback() {
197
+ if (!this.initFinished) return;
198
+
199
+ this.resizeSub.unsubscribe();
200
+ window.removeEventListener('orientationchange', this.windowResizedBound);
201
+ }
202
+
203
+ private windowResized() {
204
+ this.resize();
205
+ }
206
+
207
+ resize() {
208
+ this.dockManager.resize(this.clientWidth, this.clientHeight);
209
+ }
210
+
211
+ getDockNodeForElement(elementOrContainer: HTMLElement | PanelContainer): DockNode {
212
+ let element = elementOrContainer as HTMLElement;
213
+ if ((<any>element).containerElement)
214
+ element = (<any>elementOrContainer).containerElement as HTMLElement;
215
+ return this.dockManager.findNodeFromContainerElement(element);
216
+ }
217
+
218
+ dockFill(element: HTMLElement, panelType?: PanelType, dockNode?: DockNode, title?: string, hideCloseButton?: boolean) {
219
+ const container = new PanelContainer(element as HTMLElement, this.dockManager, title, panelType, hideCloseButton);
220
+ this.dockManager.dockFill(dockNode != null ? dockNode : this.dockManager.context.model.documentManagerNode, container);
221
+ }
222
+
223
+ dockLeft(element: HTMLElement, panelType?: PanelType, dockNode?: DockNode, ratio?: number, title?: string, hideCloseButton?: boolean) {
224
+ const container = new PanelContainer(element as HTMLElement, this.dockManager, title, panelType, hideCloseButton);
225
+ this.dockManager.dockLeft(dockNode != null ? dockNode : this.dockManager.context.model.documentManagerNode, container, ratio);
226
+ }
227
+
228
+ dockRight(element: HTMLElement, panelType?: PanelType, dockNode?: DockNode, ratio?: number, title?: string, hideCloseButton?: boolean) {
229
+ const container = new PanelContainer(element as HTMLElement, this.dockManager, title, panelType, hideCloseButton);
230
+ this.dockManager.dockRight(dockNode != null ? dockNode : this.dockManager.context.model.documentManagerNode, container, ratio);
231
+ }
232
+
233
+ dockUp(element: HTMLElement, panelType?: PanelType, dockNode?: DockNode, ratio?: number, title?: string, hideCloseButton?: boolean) {
234
+ const container = new PanelContainer(element as HTMLElement, this.dockManager, title, panelType, hideCloseButton);
235
+ this.dockManager.dockUp(dockNode != null ? dockNode : this.dockManager.context.model.documentManagerNode, container, ratio);
236
+ }
237
+
238
+ dockDown(element: HTMLElement, panelType?: PanelType, dockNode?: DockNode, ratio?: number, title?: string, hideCloseButton?: boolean) {
239
+ const container = new PanelContainer(element as HTMLElement, this.dockManager, title, panelType, hideCloseButton);
240
+ this.dockManager.dockDown(dockNode != null ? dockNode : this.dockManager.context.model.documentManagerNode, container, ratio);
241
+ }
242
+
243
+ floatDialog(element: HTMLElement, x: number, y: number, width: number, height: number, panelType?: PanelType, title?: string, hideCloseButton?: boolean) {
244
+ const container = new PanelContainer(element as HTMLElement, this.dockManager, title, panelType, hideCloseButton);
245
+ const dlg = this.dockManager.floatDialog(container, x, y, null);
246
+ dlg.resize(width, height);
247
+ }
248
+ }