@datagrok-libraries/dock-spawn-dg 0.0.2 → 0.0.3

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 (261) hide show
  1. package/README.md +0 -3
  2. package/index.d.ts +33 -0
  3. package/index.d.ts.map +1 -0
  4. package/index.js +32 -0
  5. package/package.json +10 -17
  6. package/src/BrowserDialogHelper.d.ts.map +1 -0
  7. package/{lib → src}/BrowserDialogHelper.js +18 -12
  8. package/src/BrowserDialogHelper.ts +48 -47
  9. package/src/ContainerType.d.ts.map +1 -0
  10. package/src/ContainerType.ts +1 -1
  11. package/{lib → src}/Dialog.d.ts +7 -7
  12. package/src/Dialog.d.ts.map +1 -0
  13. package/{lib → src}/Dialog.js +46 -58
  14. package/src/Dialog.ts +253 -250
  15. package/src/DockConfig.d.ts.map +1 -0
  16. package/{lib → src}/DockConfig.js +0 -5
  17. package/src/DockConfig.ts +1 -1
  18. package/{lib → src}/DockGraphDeserializer.d.ts +6 -6
  19. package/src/DockGraphDeserializer.d.ts.map +1 -0
  20. package/src/DockGraphDeserializer.js +133 -0
  21. package/src/DockGraphDeserializer.ts +113 -108
  22. package/src/DockGraphSerializer.d.ts +14 -0
  23. package/src/DockGraphSerializer.d.ts.map +1 -0
  24. package/{lib → src}/DockGraphSerializer.js +11 -11
  25. package/src/DockGraphSerializer.ts +48 -47
  26. package/{lib → src}/DockLayoutEngine.d.ts +12 -12
  27. package/src/DockLayoutEngine.d.ts.map +1 -0
  28. package/{lib → src}/DockLayoutEngine.js +49 -53
  29. package/src/DockLayoutEngine.ts +351 -346
  30. package/{lib → src}/DockManager.d.ts +34 -34
  31. package/src/DockManager.d.ts.map +1 -0
  32. package/{lib → src}/DockManager.js +168 -151
  33. package/src/DockManager.ts +860 -834
  34. package/{lib → src}/DockManagerContext.d.ts +3 -3
  35. package/src/DockManagerContext.d.ts.map +1 -0
  36. package/{lib → src}/DockManagerContext.js +2 -5
  37. package/src/DockManagerContext.ts +5 -5
  38. package/{lib → src}/DockModel.d.ts +2 -2
  39. package/src/DockModel.d.ts.map +1 -0
  40. package/{lib → src}/DockModel.js +0 -3
  41. package/src/DockModel.ts +2 -2
  42. package/{lib → src}/DockNode.d.ts +1 -1
  43. package/src/DockNode.d.ts.map +1 -0
  44. package/{lib → src}/DockNode.js +0 -3
  45. package/src/DockNode.ts +2 -2
  46. package/{lib → src}/DockWheel.d.ts +5 -5
  47. package/src/DockWheel.d.ts.map +1 -0
  48. package/{lib → src}/DockWheel.js +3 -11
  49. package/src/DockWheel.ts +6 -6
  50. package/{lib → src}/DockWheelItem.d.ts +3 -3
  51. package/src/DockWheelItem.d.ts.map +1 -0
  52. package/{lib → src}/DockWheelItem.js +1 -8
  53. package/src/DockWheelItem.ts +4 -4
  54. package/{lib → src}/DocumentManagerContainer.d.ts +4 -4
  55. package/src/DocumentManagerContainer.d.ts.map +1 -0
  56. package/{lib → src}/DocumentManagerContainer.js +3 -3
  57. package/src/DocumentManagerContainer.ts +9 -9
  58. package/{lib → src}/DocumentTabPage.d.ts +3 -3
  59. package/src/DocumentTabPage.d.ts.map +1 -0
  60. package/{lib → src}/DocumentTabPage.js +2 -2
  61. package/src/DocumentTabPage.ts +6 -6
  62. package/{lib → src}/DraggableContainer.d.ts +7 -7
  63. package/src/DraggableContainer.d.ts.map +1 -0
  64. package/{lib → src}/DraggableContainer.js +3 -16
  65. package/src/DraggableContainer.ts +10 -10
  66. package/src/EventHandler.d.ts.map +1 -0
  67. package/{lib → src}/EventHandler.js +0 -3
  68. package/src/EventHandler.ts +1 -1
  69. package/{lib → src}/FillDockContainer.d.ts +8 -8
  70. package/src/FillDockContainer.d.ts.map +1 -0
  71. package/{lib → src}/FillDockContainer.js +4 -14
  72. package/src/FillDockContainer.ts +10 -10
  73. package/src/HorizontalDockContainer.d.ts +7 -0
  74. package/src/HorizontalDockContainer.d.ts.map +1 -0
  75. package/{lib → src}/HorizontalDockContainer.js +3 -3
  76. package/src/HorizontalDockContainer.ts +6 -6
  77. package/{lib → src}/PanelContainer.d.ts +21 -20
  78. package/src/PanelContainer.d.ts.map +1 -0
  79. package/{lib → src}/PanelContainer.js +144 -148
  80. package/src/PanelContainer.ts +590 -577
  81. package/src/Point.d.ts.map +1 -0
  82. package/{lib → src}/Point.js +0 -2
  83. package/{lib → src}/ResizableContainer.d.ts +8 -8
  84. package/src/ResizableContainer.d.ts.map +1 -0
  85. package/{lib → src}/ResizableContainer.js +4 -17
  86. package/src/ResizableContainer.ts +11 -11
  87. package/{lib → src}/ResizeHandle.d.ts +1 -1
  88. package/src/ResizeHandle.d.ts.map +1 -0
  89. package/{lib → src}/ResizeHandle.js +0 -10
  90. package/src/ResizeHandle.ts +2 -2
  91. package/{lib → src}/SplitterBar.d.ts +3 -3
  92. package/src/SplitterBar.d.ts.map +1 -0
  93. package/{lib → src}/SplitterBar.js +2 -14
  94. package/src/SplitterBar.ts +5 -5
  95. package/{lib → src}/SplitterDockContainer.d.ts +7 -7
  96. package/src/SplitterDockContainer.d.ts.map +1 -0
  97. package/{lib → src}/SplitterDockContainer.js +1 -11
  98. package/src/SplitterDockContainer.ts +8 -8
  99. package/{lib → src}/SplitterPanel.d.ts +2 -2
  100. package/src/SplitterPanel.d.ts.map +1 -0
  101. package/{lib → src}/SplitterPanel.js +2 -6
  102. package/src/SplitterPanel.ts +4 -4
  103. package/{lib → src}/TabHandle.d.ts +5 -5
  104. package/src/TabHandle.d.ts.map +1 -0
  105. package/{lib → src}/TabHandle.js +81 -95
  106. package/src/TabHandle.ts +314 -311
  107. package/{lib → src}/TabHost.d.ts +6 -6
  108. package/src/TabHost.d.ts.map +1 -0
  109. package/{lib → src}/TabHost.js +4 -19
  110. package/src/TabHost.ts +9 -9
  111. package/{lib → src}/TabPage.d.ts +4 -4
  112. package/src/TabPage.d.ts.map +1 -0
  113. package/{lib → src}/TabPage.js +3 -10
  114. package/src/TabPage.ts +6 -6
  115. package/{lib → src}/UndockInitiator.d.ts +4 -4
  116. package/src/UndockInitiator.d.ts.map +1 -0
  117. package/{lib → src}/UndockInitiator.js +2 -14
  118. package/src/UndockInitiator.ts +7 -7
  119. package/src/Utils.d.ts.map +1 -0
  120. package/{lib → src}/Utils.js +1 -1
  121. package/src/Utils.ts +1 -1
  122. package/src/VerticalDockContainer.d.ts +7 -0
  123. package/src/VerticalDockContainer.d.ts.map +1 -0
  124. package/{lib → src}/VerticalDockContainer.js +3 -3
  125. package/src/VerticalDockContainer.ts +7 -7
  126. package/src/enums/PanelType.d.ts.map +1 -0
  127. package/src/enums/PanelType.ts +1 -1
  128. package/src/enums/TabHostDirection.d.ts.map +1 -0
  129. package/src/enums/TabHostDirection.ts +1 -1
  130. package/src/enums/WheelTypes.d.ts.map +1 -0
  131. package/src/enums/WheelTypes.ts +1 -1
  132. package/src/i18n/Defaults.d.ts.map +1 -0
  133. package/src/i18n/Defaults.ts +2 -2
  134. package/{lib → src}/i18n/Localizer.d.ts +1 -1
  135. package/src/i18n/Localizer.d.ts.map +1 -0
  136. package/{lib → src}/i18n/Localizer.js +3 -3
  137. package/src/i18n/Localizer.ts +2 -2
  138. package/src/index.d.ts.map +1 -0
  139. package/{lib → src}/interfaces/IDockContainer.d.ts +4 -4
  140. package/src/interfaces/IDockContainer.d.ts.map +1 -0
  141. package/src/interfaces/IDockContainer.ts +7 -7
  142. package/src/interfaces/IDockContainerWithSize.d.ts +6 -0
  143. package/src/interfaces/IDockContainerWithSize.d.ts.map +1 -0
  144. package/src/interfaces/IDockContainerWithSize.ts +3 -3
  145. package/{lib → src}/interfaces/ILayoutEventListener.d.ts +6 -6
  146. package/src/interfaces/ILayoutEventListener.d.ts.map +1 -0
  147. package/src/interfaces/ILayoutEventListener.ts +7 -7
  148. package/src/interfaces/IMouseOrTouchEvent.d.ts.map +1 -0
  149. package/src/interfaces/IMouseOrTouchEvent.ts +1 -1
  150. package/src/interfaces/INodeInfo.d.ts +8 -0
  151. package/src/interfaces/INodeInfo.d.ts.map +1 -0
  152. package/src/interfaces/INodeInfo.ts +2 -2
  153. package/src/interfaces/IPanelInfo.d.ts +10 -0
  154. package/src/interfaces/IPanelInfo.d.ts.map +1 -0
  155. package/src/interfaces/IPanelInfo.ts +3 -3
  156. package/src/interfaces/IRectangle.d.ts.map +1 -0
  157. package/src/interfaces/IRectangle.ts +1 -1
  158. package/src/interfaces/ISize.d.ts.map +1 -0
  159. package/{lib → src}/interfaces/IState.d.ts +1 -0
  160. package/src/interfaces/IState.d.ts.map +1 -0
  161. package/src/interfaces/IState.ts +1 -0
  162. package/src/interfaces/IThickness.d.ts.map +1 -0
  163. package/src/interfaces/IThickness.ts +1 -1
  164. package/{lib → src}/webcomponent/DockSpawnTsWebcomponent.d.ts +4 -4
  165. package/src/webcomponent/DockSpawnTsWebcomponent.d.ts.map +1 -0
  166. package/{lib → src}/webcomponent/DockSpawnTsWebcomponent.js +69 -61
  167. package/src/webcomponent/DockSpawnTsWebcomponent.ts +239 -241
  168. package/src/webcomponent/styles.d.ts.map +1 -0
  169. package/{lib → src}/webcomponent/styles.js +2 -1
  170. package/tsconfig.json +13 -26
  171. package/.eslintrc.json +0 -47
  172. package/lib/BrowserDialogHelper.d.ts.map +0 -1
  173. package/lib/ContainerType.d.ts.map +0 -1
  174. package/lib/Dialog.d.ts.map +0 -1
  175. package/lib/DockConfig.d.ts.map +0 -1
  176. package/lib/DockGraphDeserializer.d.ts.map +0 -1
  177. package/lib/DockGraphDeserializer.js +0 -114
  178. package/lib/DockGraphSerializer.d.ts +0 -14
  179. package/lib/DockGraphSerializer.d.ts.map +0 -1
  180. package/lib/DockLayoutEngine.d.ts.map +0 -1
  181. package/lib/DockManager.d.ts.map +0 -1
  182. package/lib/DockManagerContext.d.ts.map +0 -1
  183. package/lib/DockModel.d.ts.map +0 -1
  184. package/lib/DockNode.d.ts.map +0 -1
  185. package/lib/DockWheel.d.ts.map +0 -1
  186. package/lib/DockWheelItem.d.ts.map +0 -1
  187. package/lib/DocumentManagerContainer.d.ts.map +0 -1
  188. package/lib/DocumentTabPage.d.ts.map +0 -1
  189. package/lib/DraggableContainer.d.ts.map +0 -1
  190. package/lib/EventHandler.d.ts.map +0 -1
  191. package/lib/FillDockContainer.d.ts.map +0 -1
  192. package/lib/HorizontalDockContainer.d.ts +0 -7
  193. package/lib/HorizontalDockContainer.d.ts.map +0 -1
  194. package/lib/PanelContainer.d.ts.map +0 -1
  195. package/lib/Point.d.ts.map +0 -1
  196. package/lib/ResizableContainer.d.ts.map +0 -1
  197. package/lib/ResizeHandle.d.ts.map +0 -1
  198. package/lib/SplitterBar.d.ts.map +0 -1
  199. package/lib/SplitterDockContainer.d.ts.map +0 -1
  200. package/lib/SplitterPanel.d.ts.map +0 -1
  201. package/lib/TabHandle.d.ts.map +0 -1
  202. package/lib/TabHost.d.ts.map +0 -1
  203. package/lib/TabPage.d.ts.map +0 -1
  204. package/lib/UndockInitiator.d.ts.map +0 -1
  205. package/lib/Utils.d.ts.map +0 -1
  206. package/lib/VerticalDockContainer.d.ts +0 -7
  207. package/lib/VerticalDockContainer.d.ts.map +0 -1
  208. package/lib/enums/PanelType.d.ts.map +0 -1
  209. package/lib/enums/TabHostDirection.d.ts.map +0 -1
  210. package/lib/enums/WheelTypes.d.ts.map +0 -1
  211. package/lib/i18n/Defaults.d.ts.map +0 -1
  212. package/lib/i18n/Localizer.d.ts.map +0 -1
  213. package/lib/index.d.ts.map +0 -1
  214. package/lib/interfaces/IDockContainer.d.ts.map +0 -1
  215. package/lib/interfaces/IDockContainerWithSize.d.ts +0 -6
  216. package/lib/interfaces/IDockContainerWithSize.d.ts.map +0 -1
  217. package/lib/interfaces/ILayoutEventListener.d.ts.map +0 -1
  218. package/lib/interfaces/IMouseOrTouchEvent.d.ts.map +0 -1
  219. package/lib/interfaces/INodeInfo.d.ts +0 -8
  220. package/lib/interfaces/INodeInfo.d.ts.map +0 -1
  221. package/lib/interfaces/IPanelInfo.d.ts +0 -10
  222. package/lib/interfaces/IPanelInfo.d.ts.map +0 -1
  223. package/lib/interfaces/IRectangle.d.ts.map +0 -1
  224. package/lib/interfaces/ISize.d.ts.map +0 -1
  225. package/lib/interfaces/IState.d.ts.map +0 -1
  226. package/lib/interfaces/IThickness.d.ts.map +0 -1
  227. package/lib/webcomponent/DockSpawnTsWebcomponent.d.ts.map +0 -1
  228. package/lib/webcomponent/styles.d.ts.map +0 -1
  229. package/tsconfig.tsbuildinfo +0 -1
  230. /package/{lib → src}/BrowserDialogHelper.d.ts +0 -0
  231. /package/{lib → src}/ContainerType.d.ts +0 -0
  232. /package/{lib → src}/ContainerType.js +0 -0
  233. /package/{lib → src}/DockConfig.d.ts +0 -0
  234. /package/{lib → src}/EventHandler.d.ts +0 -0
  235. /package/{lib → src}/Point.d.ts +0 -0
  236. /package/{lib → src}/Utils.d.ts +0 -0
  237. /package/{lib → src}/enums/PanelType.d.ts +0 -0
  238. /package/{lib → src}/enums/PanelType.js +0 -0
  239. /package/{lib → src}/enums/TabHostDirection.d.ts +0 -0
  240. /package/{lib → src}/enums/TabHostDirection.js +0 -0
  241. /package/{lib → src}/enums/WheelTypes.d.ts +0 -0
  242. /package/{lib → src}/enums/WheelTypes.js +0 -0
  243. /package/{lib → src}/i18n/Defaults.d.ts +0 -0
  244. /package/{lib → src}/i18n/Defaults.js +0 -0
  245. /package/{lib → src}/index.d.ts +0 -0
  246. /package/{lib → src}/index.js +0 -0
  247. /package/{lib → src}/interfaces/IDockContainer.js +0 -0
  248. /package/{lib → src}/interfaces/IDockContainerWithSize.js +0 -0
  249. /package/{lib → src}/interfaces/ILayoutEventListener.js +0 -0
  250. /package/{lib → src}/interfaces/IMouseOrTouchEvent.d.ts +0 -0
  251. /package/{lib → src}/interfaces/IMouseOrTouchEvent.js +0 -0
  252. /package/{lib → src}/interfaces/INodeInfo.js +0 -0
  253. /package/{lib → src}/interfaces/IPanelInfo.js +0 -0
  254. /package/{lib → src}/interfaces/IRectangle.d.ts +0 -0
  255. /package/{lib → src}/interfaces/IRectangle.js +0 -0
  256. /package/{lib → src}/interfaces/ISize.d.ts +0 -0
  257. /package/{lib → src}/interfaces/ISize.js +0 -0
  258. /package/{lib → src}/interfaces/IState.js +0 -0
  259. /package/{lib → src}/interfaces/IThickness.d.ts +0 -0
  260. /package/{lib → src}/interfaces/IThickness.js +0 -0
  261. /package/{lib → src}/webcomponent/styles.d.ts +0 -0
@@ -1,599 +1,612 @@
1
- import {DockManager} from './DockManager.js';
2
- import {Utils} from './Utils.js';
3
- import {UndockInitiator} from './UndockInitiator.js';
4
- import {ContainerType} from './ContainerType.js';
5
- import {EventHandler} from './EventHandler.js';
6
- import {ISize} from './interfaces/ISize.js';
7
- import {IDockContainerWithSize} from './interfaces/IDockContainerWithSize.js';
8
- import {IState} from './interfaces/IState.js';
9
- import {Point} from './Point.js';
10
- import {IDockContainer} from './interfaces/IDockContainer.js';
11
- import {PanelType} from './enums/PanelType.js';
12
- import {Dialog} from './Dialog.js';
13
- import {TabPage} from './TabPage.js';
14
- import {Localizer} from './i18n/Localizer.js';
15
- import {moveElementToNewBrowserWindow} from './BrowserDialogHelper.js';
1
+ import { DockManager } from "./DockManager";
2
+ import { Utils } from "./Utils";
3
+ import { UndockInitiator } from "./UndockInitiator";
4
+ import { ContainerType } from "./ContainerType";
5
+ import { EventHandler } from "./EventHandler";
6
+ import { ISize } from "./interfaces/ISize";
7
+ import { IDockContainerWithSize } from "./interfaces/IDockContainerWithSize";
8
+ import { IState } from "./interfaces/IState";
9
+ import { Point } from "./Point";
10
+ import { IDockContainer } from "./interfaces/IDockContainer";
11
+ import { PanelType } from "./enums/PanelType";
12
+ import { Dialog } from "./Dialog";
13
+ import { TabPage } from './TabPage';
14
+ import { Localizer } from "./i18n/Localizer";
15
+ import { moveElementToNewBrowserWindow } from "./BrowserDialogHelper";
16
16
 
17
17
  /**
18
18
  * This dock container wraps the specified element on a panel frame with a title bar and close button
19
19
  */
20
20
  export class PanelContainer implements IDockContainerWithSize {
21
- public closePanelContainerCallback: (panelContainer: PanelContainer) => Promise<boolean>;
22
-
23
- onTitleChanged: (panelContainer: PanelContainer, title: string) => void;
24
- elementPanel: HTMLDivElement;
25
- elementTitle: HTMLDivElement;
26
- elementTitleText: HTMLDivElement;
27
- elementContentHost: HTMLDivElement;
28
- name: string;
29
- state: ISize;
30
- elementContent: HTMLElement & { resizeHandler?: any, _dockSpawnPanelContainer: PanelContainer };
31
- private _resolvedElementContent: HTMLElement;
32
- elementContentContainer: HTMLElement;
33
- elementContentWrapper: HTMLElement;
34
- dockManager: DockManager;
35
- title: string;
36
- containerType: ContainerType;
37
- icon: string;
38
- hasChanges: boolean;
39
- minimumAllowedChildNodes: number;
40
- isDialog: boolean;
41
- eventListeners: any[];
42
- undockInitiator: UndockInitiator;
43
- elementButtonClose: HTMLDivElement;
44
- closeButtonClickedHandler: EventHandler;
45
- closeButtonTouchedHandler: EventHandler;
46
- mouseDownHandler: EventHandler;
47
- touchDownHandler: EventHandler;
48
- panelType: PanelType;
49
- tabPage?: TabPage;
50
- undockedToNewBrowserWindow = false;
51
- contextMenuHandler: EventHandler;
52
-
53
- lastDialogSize?: ISize;
54
-
55
- _floatingDialog?: Dialog;
56
- _canUndock: boolean;
57
- _cachedWidth: number;
58
- _cachedHeight: number;
59
- _hideCloseButton: boolean;
60
- _grayOut: HTMLDivElement;
61
- _ctxMenu: HTMLDivElement;
62
-
63
- constructor(elementContent: HTMLElement, dockManager: DockManager, title?: string, panelType?: PanelType, hideCloseButton?: boolean, panelIcon?: string) {
64
- if (!title)
65
- title = Localizer.getString('DefaultPanelName');
66
- if (!panelType)
67
- panelType = PanelType.panel;
68
- this.panelType = panelType;
69
-
70
- (<any>elementContent)._dockSpawnPanelContainer = this;
71
- this.elementContent = <any>elementContent;
72
- elementContent.style.position = 'absolute';
73
- elementContent.style.width = '100%';
74
- elementContent.style.height = '100%';
75
- elementContent.style.top = '0';
76
- elementContent.style.bottom = '0';
77
- this.elementContentContainer = document.createElement('div');
78
- this.elementContentContainer.className = 'panel-element-content-container';
79
- this.elementContentContainer.style.position = 'absolute';
80
- (<any> this.elementContentContainer)._panel = this;
81
- this.elementContentContainer.addEventListener('pointerdown', (e) => {
82
- try {
83
- if (this.isDialog)
84
- this._floatingDialog.bringToFront();
85
- else {
86
- if (this.tabPage)
87
- this.tabPage.setSelected(true, true);
88
- }
89
- this.dockManager.activePanel = this;
90
- } catch { }
91
- }, {passive: true});
92
- this.elementContentContainer.appendChild(elementContent);
93
- dockManager.config.dialogRootElement.appendChild(this.elementContentContainer);
94
-
95
- this.dockManager = dockManager;
96
- this.title = title;
97
- this.containerType = ContainerType.panel;
98
- this.icon = panelIcon;
99
- this.minimumAllowedChildNodes = 0;
100
- this._floatingDialog = undefined;
101
- this.isDialog = false;
102
- this._canUndock = dockManager._undockEnabled;
103
- this.eventListeners = [];
104
- this._hideCloseButton = hideCloseButton;
105
- this.windowsContextMenuClose = this.windowsContextMenuClose.bind(this);
106
-
107
- this._initialize();
108
- }
109
-
110
- _initialize() {
111
- this.name = Utils.getNextId('panel_');
112
- this.elementPanel = document.createElement('div');
113
- this.elementPanel.tabIndex = 0;
114
- this.elementTitle = document.createElement('div');
115
- this.contextMenuHandler = new EventHandler(this.elementTitle, 'contextmenu', this.oncontextMenuClicked.bind(this));
116
-
117
- this.elementTitleText = document.createElement('div');
118
- this.elementContentHost = document.createElement('div');
119
- this.elementButtonClose = document.createElement('div');
120
-
121
- this.elementPanel.appendChild(this.elementTitle);
122
- this.elementTitle.appendChild(this.elementTitleText);
123
- this.elementTitle.appendChild(this.elementButtonClose);
124
- this.elementButtonClose.classList.add('panel-titlebar-button-close');
125
- this.elementButtonClose.style.display = this._hideCloseButton ? 'none' : 'block';
126
-
127
- this.elementPanel.appendChild(this.elementContentHost);
128
-
129
- this.elementPanel.classList.add('panel-base');
130
- this.elementTitle.classList.add('panel-titlebar');
131
- this.elementTitle.classList.add('disable-selection');
132
- this.elementTitleText.classList.add('panel-titlebar-text');
133
- this.elementContentHost.classList.add('panel-content');
134
-
135
- // set the size of the dialog elements based on the panel's size
136
- const panelWidth = this.elementContentContainer.clientWidth;
137
- const panelHeight = this.elementContentContainer.clientHeight;
138
- const titleHeight = this.elementTitle.clientHeight;
139
-
140
- this.elementContentWrapper = document.createElement('div');
141
- this.elementContentWrapper.classList.add('panel-content-wrapper');
142
-
143
- this._setPanelDimensions(panelWidth, panelHeight + titleHeight);
144
-
145
- if (!this._hideCloseButton) {
146
- this.closeButtonClickedHandler =
21
+ public closePanelContainerCallback: (panelContainer: PanelContainer) => Promise<boolean>;
22
+
23
+ onTitleChanged: (panelContainer: PanelContainer, title: string) => void;
24
+ elementPanel: HTMLDivElement;
25
+ elementTitle: HTMLDivElement;
26
+ elementTitleText: HTMLDivElement;
27
+ elementContentHost: HTMLDivElement;
28
+ name: string;
29
+ state: ISize;
30
+ elementContent: HTMLElement & { resizeHandler?: any, _dockSpawnPanelContainer: PanelContainer };
31
+ private _resolvedElementContent: HTMLElement;
32
+ elementContentContainer: HTMLElement;
33
+ elementContentWrapper: HTMLElement;
34
+ dockManager: DockManager;
35
+ title: string;
36
+ containerType: ContainerType;
37
+ icon: string;
38
+ zIndex: string;
39
+ hasChanges: boolean;
40
+ minimumAllowedChildNodes: number;
41
+ isDialog: boolean;
42
+ eventListeners: any[];
43
+ undockInitiator: UndockInitiator;
44
+ elementButtonClose: HTMLDivElement;
45
+ closeButtonClickedHandler: EventHandler;
46
+ closeButtonTouchedHandler: EventHandler;
47
+ mouseDownHandler: EventHandler;
48
+ touchDownHandler: EventHandler;
49
+ panelType: PanelType;
50
+ tabPage?: TabPage;
51
+ undockedToNewBrowserWindow = false;
52
+ contextMenuHandler: EventHandler;
53
+
54
+ lastDialogSize?: ISize;
55
+
56
+ _floatingDialog?: Dialog;
57
+ _canUndock: boolean;
58
+ _cachedWidth: number;
59
+ _cachedHeight: number;
60
+ _hideCloseButton: boolean;
61
+ _grayOut: HTMLDivElement;
62
+ _ctxMenu: HTMLDivElement;
63
+
64
+ constructor(elementContent: HTMLElement, dockManager: DockManager, title?: string, panelType?: PanelType, hideCloseButton?: boolean, panelIcon?: string, zIndex?: string) {
65
+ if (!title)
66
+ title = Localizer.getString('DefaultPanelName');
67
+ if (!panelType)
68
+ panelType = PanelType.panel;
69
+ this.panelType = panelType;
70
+
71
+ (<any>elementContent)._dockSpawnPanelContainer = this;
72
+ this.elementContent = <any>elementContent;
73
+ elementContent.style.position = 'absolute'
74
+ elementContent.style.width = '100%'
75
+ elementContent.style.height = '100%'
76
+ elementContent.style.top = '0'
77
+ elementContent.style.bottom = '0'
78
+ this.elementContentContainer = document.createElement('div');
79
+ this.elementContentContainer.className = 'panel-element-content-container';
80
+ this.elementContentContainer.style.position = 'absolute';
81
+ (<any>this.elementContentContainer)._panel = this;
82
+ this.elementContentContainer.addEventListener('pointerdown', (e) => {
83
+ try {
84
+ if (this.isDialog) {
85
+ this._floatingDialog.bringToFront();
86
+ } else {
87
+ if (this.tabPage)
88
+ this.tabPage.setSelected(true, true);
89
+ }
90
+ this.dockManager.activePanel = this;
91
+ }
92
+ catch { }
93
+ }, { passive: true });
94
+ this.elementContentContainer.appendChild(elementContent);
95
+ dockManager.config.dialogRootElement.appendChild(this.elementContentContainer);
96
+
97
+ this.dockManager = dockManager;
98
+ this.title = title;
99
+ this.containerType = ContainerType.panel;
100
+ this.icon = panelIcon;
101
+ this.zIndex = zIndex;
102
+ this.minimumAllowedChildNodes = 0;
103
+ this._floatingDialog = undefined;
104
+ this.isDialog = false;
105
+ this._canUndock = dockManager._undockEnabled;
106
+ this.eventListeners = [];
107
+ this._hideCloseButton = hideCloseButton;
108
+ this.windowsContextMenuClose = this.windowsContextMenuClose.bind(this);
109
+
110
+ this._initialize();
111
+ }
112
+
113
+ _initialize() {
114
+ this.name = Utils.getNextId('panel_');
115
+ this.elementPanel = document.createElement('div');
116
+ this.elementPanel.tabIndex = 0;
117
+ this.elementTitle = document.createElement('div');
118
+ this.contextMenuHandler = new EventHandler(this.elementTitle, 'contextmenu', this.oncontextMenuClicked.bind(this));
119
+
120
+ this.elementTitleText = document.createElement('div');
121
+ this.elementContentHost = document.createElement('div');
122
+ this.elementButtonClose = document.createElement('div');
123
+
124
+ this.elementPanel.appendChild(this.elementTitle);
125
+ this.elementTitle.appendChild(this.elementTitleText);
126
+ this.elementTitle.appendChild(this.elementButtonClose);
127
+ this.elementButtonClose.classList.add('panel-titlebar-button-close');
128
+ this.elementButtonClose.style.display = this._hideCloseButton ? 'none' : 'block';
129
+
130
+ this.elementPanel.appendChild(this.elementContentHost);
131
+
132
+ this.elementPanel.classList.add('panel-base');
133
+ this.elementTitle.classList.add('panel-titlebar');
134
+ this.elementTitle.classList.add('disable-selection');
135
+ this.elementTitleText.classList.add('panel-titlebar-text');
136
+ this.elementContentHost.classList.add('panel-content');
137
+
138
+ // set the size of the dialog elements based on the panel's size
139
+ let panelWidth = this.elementContentContainer.clientWidth;
140
+ let panelHeight = this.elementContentContainer.clientHeight;
141
+ let titleHeight = this.elementTitle.clientHeight;
142
+
143
+ this.elementContentWrapper = document.createElement("div");
144
+ this.elementContentWrapper.classList.add('panel-content-wrapper');
145
+
146
+ this._setPanelDimensions(panelWidth, panelHeight + titleHeight);
147
+
148
+ if (!this._hideCloseButton) {
149
+ this.closeButtonClickedHandler =
147
150
  new EventHandler(this.elementButtonClose, 'mousedown', this.onCloseButtonClicked.bind(this));
148
- this.closeButtonTouchedHandler =
151
+ this.closeButtonTouchedHandler =
149
152
  new EventHandler(this.elementButtonClose, 'touchstart', this.onCloseButtonClicked.bind(this));
153
+ }
154
+
155
+ Utils.removeNode(this.elementContentWrapper);
156
+ this.elementContentHost.appendChild(this.elementContentWrapper);
157
+
158
+ // Extract the title from the content element's attribute
159
+ let contentTitle = this.elementContent.dataset.panelCaption;
160
+ if (contentTitle) this.title = contentTitle;
161
+ this._updateTitle();
162
+
163
+ this.undockInitiator = new UndockInitiator(this.elementTitle, this.performUndockToDialog.bind(this));
164
+ delete this.floatingDialog;
165
+
166
+ this.mouseDownHandler = new EventHandler(this.elementPanel, 'mousedown', this.onMouseDown.bind(this));
167
+ this.touchDownHandler = new EventHandler(this.elementPanel, 'touchstart', this.onMouseDown.bind(this), { passive: true });
168
+
169
+ this._resolvedElementContent = this.elementContent;
170
+ if (this.elementContent instanceof HTMLSlotElement) {
171
+ this._resolvedElementContent = <HTMLElement>this.elementContent.assignedElements()?.[0];
172
+ }
173
+ this.elementContent.parentElement.style.zIndex = this.zIndex;
174
+ }
175
+
176
+ static createContextMenuContentCallback = (panelContainer: PanelContainer): Node[] => {
177
+ const result = [];
178
+
179
+ if (panelContainer.dockManager.config.enableBrowserWindows) {
180
+ let btnNewBrowserWindow = document.createElement('div');
181
+ btnNewBrowserWindow.innerText = Localizer.getString('NewBrowserWindow');
182
+ result.push(btnNewBrowserWindow);
183
+
184
+ btnNewBrowserWindow.onclick = () => {
185
+ panelContainer.undockToBrowserDialog();
186
+ panelContainer.closeContextMenu();
187
+ };
188
+ }
189
+
190
+ return result;
191
+ }
192
+
193
+ oncontextMenuClicked(e: MouseEvent) {
194
+ e.preventDefault();
195
+
196
+ if (!this._ctxMenu && PanelContainer.createContextMenuContentCallback) {
197
+ const menuItems = PanelContainer.createContextMenuContentCallback(this);
198
+
199
+ if (menuItems.length == 0) {
200
+ return;
201
+ }
202
+
203
+ this._ctxMenu = document.createElement('div');
204
+ this._ctxMenu.className = 'dockspab-tab-handle-context-menu';
205
+ this._ctxMenu.append(...menuItems);
206
+ this._ctxMenu.style.left = e.pageX + "px";
207
+ this._ctxMenu.style.top = e.pageY + "px";
208
+ document.body.appendChild(this._ctxMenu);
209
+ window.addEventListener('mouseup', this.windowsContextMenuClose);
210
+ } else {
211
+ this.closeContextMenu();
212
+ }
213
+ }
214
+
215
+ closeContextMenu() {
216
+ if (this._ctxMenu) {
217
+ document.body.removeChild(this._ctxMenu);
218
+ delete this._ctxMenu;
219
+ window.removeEventListener('mouseup', this.windowsContextMenuClose);
220
+ }
221
+ }
222
+
223
+ windowsContextMenuClose(e: Event) {
224
+ let cp = e.composedPath();
225
+ for (let i in cp) {
226
+ let el = cp[i];
227
+ if (el == this._ctxMenu)
228
+ return;
229
+ }
230
+ this.closeContextMenu();
231
+ }
232
+
233
+ canUndock(state: boolean) {
234
+ this._canUndock = state;
235
+ this.undockInitiator.enabled = state;
236
+ this.eventListeners.forEach((listener) => {
237
+ if (listener.onDockEnabled) {
238
+ listener.onDockEnabled({ self: this, state: state });
239
+ }
240
+ });
241
+ }
242
+
243
+ addListener(listener) {
244
+ this.eventListeners.push(listener);
245
+ }
246
+
247
+ removeListener(listener) {
248
+ this.eventListeners.splice(this.eventListeners.indexOf(listener), 1);
249
+ }
250
+
251
+ get floatingDialog(): Dialog {
252
+ return this._floatingDialog;
253
+ }
254
+ set floatingDialog(value: Dialog) {
255
+ this._floatingDialog = value;
256
+ let canUndock = (this._floatingDialog === undefined);
257
+ this.undockInitiator.enabled = canUndock;
258
+ }
259
+
260
+ static async loadFromState(state: IState, dockManager: DockManager) {
261
+ let elementContent: HTMLElement;
262
+ let title: string;
263
+ if (!dockManager.getElementCallback) {
264
+ let elementName = state.element;
265
+ elementContent = document.getElementById(elementName);
266
+ } else {
267
+ let res = await dockManager.getElementCallback(state);
268
+ elementContent = res.element;
269
+ title = res.title;
270
+ }
271
+
272
+ if (elementContent === null) {
273
+ return null;
274
+ }
275
+ let ret = new PanelContainer(elementContent, dockManager, title, state.panelType, state.hideCloseButton, state.panelIcon, state.zIndex);
276
+ ret.loadState(state);
277
+ return ret;
278
+ }
279
+
280
+ saveState(state: IState) {
281
+ state.panelIcon = this.icon;
282
+ state.zIndex = this.zIndex;
283
+ state.element = this.elementContent.tagName === 'SLOT' ?
284
+ //@ts-ignore
285
+ this.elementContent.assignedElements()[0].getAttribute('dock-spawn-title') :
286
+ this.elementContent.id;
287
+ state.width = this.width;
288
+ state.height = this.height;
289
+ state.canUndock = this._canUndock;
290
+ state.hideCloseButton = this._hideCloseButton;
291
+ state.panelType = this.panelType;
292
+ }
293
+
294
+ loadState(state: IState) {
295
+ this.width = state.width;
296
+ this.height = state.height;
297
+ this.state = { width: state.width, height: state.height };
298
+ this.canUndock(state.canUndock)
299
+ this.hideCloseButton(state.hideCloseButton);
300
+ this.panelType = state.panelType;
301
+ this.icon = state.panelIcon;
302
+ this.zIndex = state.zIndex;
303
+ this._updateTitle();
304
+ }
305
+
306
+ setActiveChild(/*child*/) {
307
+ }
308
+
309
+ get containerElement() {
310
+ return this.elementPanel;
311
+ }
312
+
313
+ grayOut(show: boolean) {
314
+ if (!show && this._grayOut) {
315
+ this.elementContentWrapper.removeChild(this._grayOut);
316
+ this.elementButtonClose.style.display = this._hideCloseButton ? 'none' : 'block';
317
+ this._grayOut = null;
318
+ if (!this._hideCloseButton)
319
+ this.eventListeners.forEach((listener) => {
320
+ if (listener.onHideCloseButton) {
321
+ listener.onHideCloseButton({ self: this, state: this._hideCloseButton });
322
+ }
323
+ });
324
+ }
325
+ else if (show && !this._grayOut) {
326
+ this._grayOut = document.createElement('div');
327
+ this._grayOut.className = 'panel-grayout';
328
+ this.elementButtonClose.style.display = 'none';
329
+ this.elementContentWrapper.appendChild(this._grayOut);
330
+ this.eventListeners.forEach((listener) => {
331
+ if (listener.onHideCloseButton) {
332
+ listener.onHideCloseButton({ self: this, state: true });
333
+ }
334
+ });
335
+ }
150
336
  }
151
337
 
152
- Utils.removeNode(this.elementContentWrapper);
153
- this.elementContentHost.appendChild(this.elementContentWrapper);
154
-
155
- // Extract the title from the content element's attribute
156
- const contentTitle = this.elementContent.dataset.panelCaption;
157
- if (contentTitle) this.title = contentTitle;
158
- this._updateTitle();
159
-
160
- this.undockInitiator = new UndockInitiator(this.elementTitle, this.performUndockToDialog.bind(this));
161
- delete this.floatingDialog;
162
-
163
- this.mouseDownHandler = new EventHandler(this.elementPanel, 'mousedown', this.onMouseDown.bind(this));
164
- this.touchDownHandler = new EventHandler(this.elementPanel, 'touchstart', this.onMouseDown.bind(this), {passive: true});
165
-
166
- this._resolvedElementContent = this.elementContent;
167
- if (this.elementContent instanceof HTMLSlotElement)
168
- this._resolvedElementContent = <HTMLElement> this.elementContent.assignedElements()?.[0];
169
- }
170
-
171
- static createContextMenuContentCallback = (panelContainer: PanelContainer): Node[] => {
172
- const result = [];
173
-
174
- if (panelContainer.dockManager.config.enableBrowserWindows) {
175
- const btnNewBrowserWindow = document.createElement('div');
176
- btnNewBrowserWindow.innerText = Localizer.getString('NewBrowserWindow');
177
- result.push(btnNewBrowserWindow);
178
-
179
- btnNewBrowserWindow.onclick = () => {
180
- panelContainer.undockToBrowserDialog();
181
- panelContainer.closeContextMenu();
182
- };
183
- }
184
-
185
- return result;
186
- };
187
-
188
- oncontextMenuClicked(e: MouseEvent) {
189
- e.preventDefault();
190
-
191
- if (!this._ctxMenu && PanelContainer.createContextMenuContentCallback) {
192
- const menuItems = PanelContainer.createContextMenuContentCallback(this);
193
-
194
- if (menuItems.length == 0)
195
- return;
196
-
197
-
198
- this._ctxMenu = document.createElement('div');
199
- this._ctxMenu.className = 'dockspab-tab-handle-context-menu';
200
- this._ctxMenu.append(...menuItems);
201
- this._ctxMenu.style.left = e.pageX + 'px';
202
- this._ctxMenu.style.top = e.pageY + 'px';
203
- document.body.appendChild(this._ctxMenu);
204
- window.addEventListener('mouseup', this.windowsContextMenuClose);
205
- } else
206
- this.closeContextMenu();
207
- }
208
-
209
- closeContextMenu() {
210
- if (this._ctxMenu) {
211
- document.body.removeChild(this._ctxMenu);
212
- delete this._ctxMenu;
213
- window.removeEventListener('mouseup', this.windowsContextMenuClose);
214
- }
215
- }
216
-
217
- windowsContextMenuClose(e: Event) {
218
- const cp = e.composedPath();
219
- for (const i in cp) {
220
- const el = cp[i];
221
- if (el == this._ctxMenu)
222
- return;
223
- }
224
- this.closeContextMenu();
225
- }
226
-
227
- canUndock(state: boolean) {
228
- this._canUndock = state;
229
- this.undockInitiator.enabled = state;
230
- this.eventListeners.forEach((listener) => {
231
- if (listener.onDockEnabled)
232
- listener.onDockEnabled({self: this, state: state});
233
- });
234
- }
235
-
236
- addListener(listener) {
237
- this.eventListeners.push(listener);
238
- }
239
-
240
- removeListener(listener) {
241
- this.eventListeners.splice(this.eventListeners.indexOf(listener), 1);
242
- }
243
-
244
- get floatingDialog(): Dialog {
245
- return this._floatingDialog;
246
- }
247
- set floatingDialog(value: Dialog) {
248
- this._floatingDialog = value;
249
- const canUndock = (this._floatingDialog === undefined);
250
- this.undockInitiator.enabled = canUndock;
251
- }
252
-
253
- static async loadFromState(state: IState, dockManager: DockManager) {
254
- let elementContent: HTMLElement;
255
- let title: string;
256
- if (!dockManager.getElementCallback) {
257
- const elementName = state.element;
258
- elementContent = document.getElementById(elementName);
259
- } else {
260
- const res = await dockManager.getElementCallback(state);
261
- elementContent = res.element;
262
- title = res.title;
263
- }
264
-
265
- if (elementContent === null)
266
- return null;
267
-
268
- const ret = new PanelContainer(elementContent, dockManager, title);
269
- ret.loadState(state);
270
- return ret;
271
- }
272
-
273
- saveState(state: IState) {
274
- state.panelIcon = this.icon;
275
- state.element = this.elementContent.tagName === 'SLOT' ?
276
- //@ts-ignore
277
- this.elementContent.assignedElements()[0].getAttribute('dock-spawn-title') :
278
- this.elementContent.id;
279
- state.width = this.width;
280
- state.height = this.height;
281
- state.canUndock = this._canUndock;
282
- state.hideCloseButton = this._hideCloseButton;
283
- state.panelType = this.panelType;
284
- }
285
-
286
- loadState(state: IState) {
287
- this.width = state.width;
288
- this.height = state.height;
289
- this.state = {width: state.width, height: state.height};
290
- this.canUndock(state.canUndock);
291
- this.hideCloseButton(state.hideCloseButton);
292
- this.panelType = state.panelType;
293
- this.icon = state.panelIcon;
294
- this._updateTitle();
295
- }
296
-
297
- setActiveChild(/*child*/) {
298
- }
299
-
300
- get containerElement() {
301
- return this.elementPanel;
302
- }
303
-
304
- grayOut(show: boolean) {
305
- if (!show && this._grayOut) {
306
- this.elementContentWrapper.removeChild(this._grayOut);
307
- this.elementButtonClose.style.display = this._hideCloseButton ? 'none' : 'block';
308
- this._grayOut = null;
309
- if (!this._hideCloseButton) {
338
+ onMouseDown() {
339
+ this.dockManager.activePanel = this;
340
+ }
341
+
342
+ hideCloseButton(state: boolean) {
343
+ this._hideCloseButton = state;
344
+ this.elementButtonClose.style.display = state ? 'none' : 'block';
310
345
  this.eventListeners.forEach((listener) => {
311
- if (listener.onHideCloseButton)
312
- listener.onHideCloseButton({self: this, state: this._hideCloseButton});
346
+ if (listener.onHideCloseButton) {
347
+ listener.onHideCloseButton({ self: this, state: state });
348
+ }
313
349
  });
314
- }
315
- } else if (show && !this._grayOut) {
316
- this._grayOut = document.createElement('div');
317
- this._grayOut.className = 'panel-grayout';
318
- this.elementButtonClose.style.display = 'none';
319
- this.elementContentWrapper.appendChild(this._grayOut);
320
- this.eventListeners.forEach((listener) => {
321
- if (listener.onHideCloseButton)
322
- listener.onHideCloseButton({self: this, state: true});
323
- });
324
- }
325
- }
326
-
327
- onMouseDown() {
328
- this.dockManager.activePanel = this;
329
- }
330
-
331
- hideCloseButton(state: boolean) {
332
- this._hideCloseButton = state;
333
- this.elementButtonClose.style.display = state ? 'none' : 'block';
334
- this.eventListeners.forEach((listener) => {
335
- if (listener.onHideCloseButton)
336
- listener.onHideCloseButton({self: this, state: state});
337
- });
338
- }
339
-
340
- destroy() {
341
- if (this.mouseDownHandler) {
342
- this.mouseDownHandler.cancel();
343
- delete this.mouseDownHandler;
344
- }
345
- if (this.touchDownHandler) {
346
- this.touchDownHandler.cancel();
347
- delete this.touchDownHandler;
348
- }
349
- if (this.contextMenuHandler)
350
- this.contextMenuHandler.cancel();
351
-
352
-
353
- Utils.removeNode(this.elementPanel);
354
- if (this.closeButtonClickedHandler) {
355
- this.closeButtonClickedHandler.cancel();
356
- delete this.closeButtonClickedHandler;
357
- }
358
- if (this.closeButtonTouchedHandler) {
359
- this.closeButtonTouchedHandler.cancel();
360
- delete this.closeButtonTouchedHandler;
361
- }
362
- }
363
-
364
- /**
350
+ }
351
+
352
+ destroy() {
353
+ if (this.mouseDownHandler) {
354
+ this.mouseDownHandler.cancel();
355
+ delete this.mouseDownHandler;
356
+ }
357
+ if (this.touchDownHandler) {
358
+ this.touchDownHandler.cancel();
359
+ delete this.touchDownHandler;
360
+ }
361
+ if (this.contextMenuHandler) {
362
+ this.contextMenuHandler.cancel();
363
+ }
364
+
365
+ Utils.removeNode(this.elementPanel);
366
+ if (this.closeButtonClickedHandler) {
367
+ this.closeButtonClickedHandler.cancel();
368
+ delete this.closeButtonClickedHandler;
369
+ }
370
+ if (this.closeButtonTouchedHandler) {
371
+ this.closeButtonTouchedHandler.cancel();
372
+ delete this.closeButtonTouchedHandler;
373
+ }
374
+ }
375
+
376
+ /**
365
377
  * Undocks the panel and and converts it to a dialog box
366
378
  */
367
- performUndockToDialog(e, dragOffset: Point) {
368
- this.isDialog = true;
369
- this.undockInitiator.enabled = false;
370
- this.elementContentWrapper.style.display = 'block';
371
- this.elementPanel.style.position = '';
372
- return this.dockManager.requestUndockToDialog(this, e, dragOffset);
373
- }
374
-
375
- /**
379
+ performUndockToDialog(e, dragOffset: Point) {
380
+ this.isDialog = true;
381
+ this.undockInitiator.enabled = false;
382
+ this.elementContentWrapper.style.display = "block";
383
+ this.elementPanel.style.position = "";
384
+ return this.dockManager.requestUndockToDialog(this, e, dragOffset);
385
+ }
386
+
387
+ /**
376
388
  * Closes the panel
377
389
  */
378
- private performClose() {
379
- this.isDialog = true;
380
- this.undockInitiator.enabled = false;
381
- this.elementContentWrapper.style.display = 'block';
382
- this.elementContentContainer.style.display = 'none';
383
- this.elementPanel.style.position = '';
384
- this.dockManager.requestClose(this);
385
- }
386
-
387
- /**
390
+ private performClose() {
391
+ this.isDialog = true;
392
+ this.undockInitiator.enabled = false;
393
+ this.elementContentWrapper.style.display = "block";
394
+ this.elementContentContainer.style.display = 'none';
395
+ this.elementPanel.style.position = "";
396
+ this.dockManager.requestClose(this);
397
+ }
398
+
399
+ /**
388
400
  * Undocks the container and from the layout hierarchy
389
401
  * The container would be removed from the DOM
390
402
  */
391
- performUndock() {
392
- this.undockInitiator.enabled = false;
393
- this.dockManager.requestUndock(this);
394
- };
395
-
396
- prepareForDocking() {
397
- this.isDialog = false;
398
- this.undockInitiator.enabled = this._canUndock;
399
- if (this.elementContentContainer.parentElement != this.dockManager.config.dialogRootElement)
400
- this.dockManager.config.dialogRootElement.appendChild(this.elementContentContainer);
401
- }
402
-
403
- get width(): number {
404
- return this._cachedWidth;
405
- }
406
- set width(value: number) {
407
- if (value !== this._cachedWidth) {
408
- this._cachedWidth = value;
409
- this.elementPanel.style.width = value + 'px';
410
- }
411
- }
412
-
413
- get height(): number {
414
- return this._cachedHeight;
415
- }
416
- set height(value: number) {
417
- if (value !== this._cachedHeight) {
418
- this._cachedHeight = value;
419
- this.elementPanel.style.height = value + 'px';
420
- }
421
- }
422
-
423
- get resolvedElementContent(): HTMLElement {
424
- if (this._resolvedElementContent)
425
- return this._resolvedElementContent;
426
- this._resolvedElementContent = this.elementContent;
427
- if (this.elementContent instanceof HTMLSlotElement)
428
- this._resolvedElementContent = <HTMLElement> this.elementContent.assignedElements()?.[0];
429
-
430
- return this._resolvedElementContent;
431
- }
432
-
433
- private panelDocked() {
434
- if (this.elementContent.hidden)
435
- this.elementContent.hidden = false;
436
- if (this.elementContentContainer.parentElement !== this.dockManager.config.dialogRootElement)
437
- this.dockManager.config.dialogRootElement.appendChild(this.elementContentContainer);
438
- }
439
-
440
- resize(width: number, height: number) {
441
- // if (this._cachedWidth === width && this._cachedHeight === height)
442
- // {
443
- // // Already in the desired size
444
- // return;
445
- // }
446
- this.panelDocked();
447
- this.setVisible(true);
448
- this._setPanelDimensions(width, height);
449
- this._cachedWidth = width;
450
- this._cachedHeight = height;
451
- try {
452
- if (this.elementContent != undefined && (typeof this.elementContent.resizeHandler == 'function'))
453
- this.elementContent.resizeHandler(width, height - this.elementTitle.clientHeight);
454
- } catch (err) {
455
- console.log('error calling resizeHandler:', err, ' elt:', this.elementContent);
456
- }
457
- }
458
-
459
- _setPanelDimensions(width: number, height: number) {
460
- this.elementTitle.style.width = width + 'px';
461
- this.elementContentHost.style.width = width + 'px';
462
- this.elementContentContainer.style.width = width + 'px';
463
- this.elementPanel.style.width = width + 'px';
464
-
465
- const titleBarHeight = this.elementTitle.clientHeight;
466
- const contentHeight = height - titleBarHeight;
467
- this.elementContentHost.style.height = contentHeight + 'px';
468
- this.elementContentContainer.style.height = contentHeight + 'px';
469
- this.elementPanel.style.height = height + 'px';
470
-
471
- //if (this.elementContentContainer.parentElement != this.dockManager.config.dialogRootElement)
472
- // this.dockManager.config.dialogRootElement.appendChild(this.elementContentContainer);
473
- const rect = this.elementContentWrapper.getBoundingClientRect();
474
- const rootRect = this.dockManager.config.dialogRootElement.getBoundingClientRect();
475
- this.elementContentContainer.style.left = (rect.x - rootRect.x) + 'px';
476
- this.elementContentContainer.style.top = (rect.y - rootRect.y) + 'px';
477
- this.elementContentContainer.style.width = rect.width + 'px';
478
- this.elementContentContainer.style.height = rect.height + 'px';
479
- }
480
-
481
- setDialogPosition(x: number, y: number) {
482
- this.elementContentContainer.style.left = x + 'px';
483
- //todo, 25px if it is a dialog, is it always 25px? where do we know...
484
- this.elementContentContainer.style.top = (y + this.elementTitle.clientHeight) + 'px';
485
- }
486
-
487
- setVisible(isVisible: boolean) {
488
- this.elementContentContainer.style.display = isVisible ? 'block' : 'none';
489
- }
490
-
491
- setTitle(title: string) {
492
- this.title = title;
493
- this._updateTitle();
494
- if (this.onTitleChanged)
495
- this.onTitleChanged(this, title);
496
- }
497
-
498
- setTitleIcon(icon: string) {
499
- this.icon = icon;
500
- this._updateTitle();
501
- if (this.onTitleChanged)
502
- this.onTitleChanged(this, this.title);
503
- }
504
-
505
- setHasChanges(changes: boolean) {
506
- this.hasChanges = changes;
507
- this._updateTitle();
508
- if (changes)
509
- this.elementTitleText.classList.add('panel-has-changes');
510
- else
511
- this.elementTitleText.classList.remove('panel-has-changes');
512
-
513
- if (this.onTitleChanged)
514
- this.onTitleChanged(this, this.title);
515
- }
516
-
517
- setCloseIconTemplate(closeIconTemplate: string) {
518
- this.elementButtonClose.innerHTML = closeIconTemplate;
519
- }
520
-
521
- _updateTitle() {
522
- if (!!this.icon) {
523
- this.elementTitleText.innerHTML = `<i class="grok-icon fal fa-${this.icon}" style="margin-right: 3px"></i><span>${this.title}</span>`;
524
- return;
525
- }
526
- this.elementTitleText.innerHTML = this.title;
527
- }
528
-
529
- getRawTitle() {
530
- return this.elementTitleText.innerHTML;
531
- }
532
-
533
- performLayout(children: IDockContainer[], relayoutEvenIfEqual: boolean) {
534
- }
535
-
536
- onCloseButtonClicked(e: Event) {
537
- e.preventDefault();
538
- e.stopPropagation();
539
- this.close();
540
- }
541
-
542
- undockToBrowserDialog() {
543
- moveElementToNewBrowserWindow(this.resolvedElementContent, {
544
- title: this.elementTitleText.textContent,
545
- closeCallback: () => {
546
- this.undockedToNewBrowserWindow = true;
547
- this.closeInternal(false);
548
- },
549
- newWindowClosedCallback: () => {
550
- this.undockedToNewBrowserWindow = false;
551
- this.dockManager.notifyOnClosePanel(this);
552
- },
553
- focused: (e) => {
554
- this.dockManager.activePanel = this;
555
- },
556
- blured: (e) => {
557
- this.dockManager.activePanel = null;
558
- },
559
- });
560
- }
561
-
562
- async close() {
563
- this.closeInternal(true);
564
- }
565
-
566
- private async closeInternal(runCallback: boolean) {
567
- let close = true;
568
-
569
- if (!(this.elementContentContainer.parentElement === this.dockManager.config.dialogRootElement))
570
- this.prepareForDocking();
571
-
572
- if (this.elementContentContainer.parentElement === this.dockManager.config.dialogRootElement) {
573
- if (!runCallback)
574
- close = true;
575
- else if (this.closePanelContainerCallback)
576
- close = await this.closePanelContainerCallback(this);
577
- else if (this.dockManager.closePanelContainerCallback)
578
- close = await this.dockManager.closePanelContainerCallback(this);
579
-
580
- if (close) {
581
- this.dockManager.config.dialogRootElement.removeChild(this.elementContentContainer);
582
-
583
- if (this.isDialog) {
584
- if (this.floatingDialog) {
585
- //this.floatingDialog.hide();
586
- this.floatingDialog.close(); // fires onClose notification
587
- }
403
+ performUndock() {
404
+ this.undockInitiator.enabled = false;
405
+ this.dockManager.requestUndock(this);
406
+ };
407
+
408
+ prepareForDocking() {
409
+ this.isDialog = false;
410
+ this.undockInitiator.enabled = this._canUndock;
411
+ if (this.elementContentContainer.parentElement != this.dockManager.config.dialogRootElement)
412
+ this.dockManager.config.dialogRootElement.appendChild(this.elementContentContainer);
413
+ }
414
+
415
+ get width(): number {
416
+ return this._cachedWidth;
417
+ }
418
+ set width(value: number) {
419
+ if (value !== this._cachedWidth) {
420
+ this._cachedWidth = value;
421
+ this.elementPanel.style.width = value + 'px';
422
+ }
423
+ }
424
+
425
+ get height(): number {
426
+ return this._cachedHeight;
427
+ }
428
+ set height(value: number) {
429
+ if (value !== this._cachedHeight) {
430
+ this._cachedHeight = value;
431
+ this.elementPanel.style.height = value + 'px';
432
+ }
433
+ }
434
+
435
+ get resolvedElementContent(): HTMLElement {
436
+ if (this._resolvedElementContent)
437
+ return this._resolvedElementContent;
438
+ this._resolvedElementContent = this.elementContent;
439
+ if (this.elementContent instanceof HTMLSlotElement) {
440
+ this._resolvedElementContent = <HTMLElement>this.elementContent.assignedElements()?.[0];
441
+ }
442
+ return this._resolvedElementContent;
443
+ }
444
+
445
+ private panelDocked() {
446
+ if (this.elementContent.hidden)
447
+ this.elementContent.hidden = false;
448
+ if (this.elementContentContainer.parentElement !== this.dockManager.config.dialogRootElement)
449
+ this.dockManager.config.dialogRootElement.appendChild(this.elementContentContainer);
450
+ }
451
+
452
+ resize(width: number, height: number) {
453
+ // if (this._cachedWidth === width && this._cachedHeight === height)
454
+ // {
455
+ // // Already in the desired size
456
+ // return;
457
+ // }
458
+ this.panelDocked();
459
+ this.setVisible(true);
460
+ this._setPanelDimensions(width, height);
461
+ this._cachedWidth = width;
462
+ this._cachedHeight = height;
463
+ try {
464
+ if (this.elementContent != undefined && (typeof this.elementContent.resizeHandler == 'function'))
465
+ this.elementContent.resizeHandler(width, height - this.elementTitle.clientHeight);
466
+ } catch (err) {
467
+ console.log("error calling resizeHandler:", err, " elt:", this.elementContent);
468
+ }
469
+ }
470
+
471
+ _setPanelDimensions(width: number, height: number) {
472
+ this.elementTitle.style.width = width + 'px';
473
+ this.elementContentHost.style.width = width + 'px';
474
+ this.elementContentContainer.style.width = width + 'px';
475
+ this.elementPanel.style.width = width + 'px';
476
+
477
+ let titleBarHeight = this.elementTitle.clientHeight;
478
+ let contentHeight = height - titleBarHeight;
479
+ this.elementContentHost.style.height = contentHeight + 'px';
480
+ this.elementContentContainer.style.height = contentHeight + 'px';
481
+ this.elementPanel.style.height = height + 'px';
482
+
483
+ //if (this.elementContentContainer.parentElement != this.dockManager.config.dialogRootElement)
484
+ // this.dockManager.config.dialogRootElement.appendChild(this.elementContentContainer);
485
+ const rect = this.elementContentWrapper.getBoundingClientRect();
486
+ const rootRect = this.dockManager.config.dialogRootElement.getBoundingClientRect();
487
+ this.elementContentContainer.style.left = (rect.x - rootRect.x) + 'px';
488
+ this.elementContentContainer.style.top = (rect.y - rootRect.y) + 'px';
489
+ this.elementContentContainer.style.width = rect.width + 'px';
490
+ this.elementContentContainer.style.height = rect.height + 'px';
491
+ }
492
+
493
+ setDialogPosition(x: number, y: number) {
494
+ this.elementContentContainer.style.left = x + 'px';
495
+ //todo, 25px if it is a dialog, is it always 25px? where do we know...
496
+ this.elementContentContainer.style.top = (y + this.elementTitle.clientHeight) + 'px';
497
+ }
498
+
499
+ setVisible(isVisible: boolean) {
500
+ this.elementContentContainer.style.display = isVisible ? 'block' : 'none';
501
+ }
502
+
503
+ setTitle(title: string) {
504
+ this.title = title;
505
+ this._updateTitle();
506
+ if (this.onTitleChanged)
507
+ this.onTitleChanged(this, title);
508
+ }
509
+
510
+ setTitleIcon(icon: string) {
511
+ this.icon = icon;
512
+ this._updateTitle();
513
+ if (this.onTitleChanged)
514
+ this.onTitleChanged(this, this.title);
515
+ }
516
+
517
+ setHasChanges(changes: boolean) {
518
+ this.hasChanges = changes;
519
+ this._updateTitle();
520
+ if (changes) {
521
+ this.elementTitleText.classList.add('panel-has-changes')
588
522
  } else {
589
- try {
590
- this.dockManager.notifyOnClosePanel(this);
591
- } catch (err) {
592
- console.error(err);
593
- }
594
- this.performClose();
523
+ this.elementTitleText.classList.remove('panel-has-changes')
524
+ }
525
+ if (this.onTitleChanged)
526
+ this.onTitleChanged(this, this.title);
527
+ }
528
+
529
+ setCloseIconTemplate(closeIconTemplate: string) {
530
+ this.elementButtonClose.innerHTML = closeIconTemplate;
531
+ }
532
+
533
+ _updateTitle() {
534
+ if (!!this.icon) {
535
+ this.elementTitleText.innerHTML = `<i class="grok-icon fal fa-${this.icon}" style="margin-right: 3px"></i><span>${this.title}</span>`;
536
+ return;
537
+ }
538
+ this.elementTitleText.innerHTML = this.title;
539
+ }
540
+
541
+ getRawTitle() {
542
+ return this.elementTitleText.innerHTML;
543
+ }
544
+
545
+ performLayout(children: IDockContainer[], relayoutEvenIfEqual: boolean) {
546
+ }
547
+
548
+ onCloseButtonClicked(e: Event) {
549
+ e.preventDefault();
550
+ e.stopPropagation();
551
+ this.close();
552
+ }
553
+
554
+ undockToBrowserDialog() {
555
+ moveElementToNewBrowserWindow(this.resolvedElementContent, {
556
+ title: this.elementTitleText.textContent,
557
+ closeCallback: () => {
558
+ this.undockedToNewBrowserWindow = true;
559
+ this.closeInternal(false);
560
+ },
561
+ newWindowClosedCallback: () => {
562
+ this.undockedToNewBrowserWindow = false;
563
+ this.dockManager.notifyOnClosePanel(this);
564
+ },
565
+ focused: (e) => {
566
+ this.dockManager.activePanel = this;
567
+ },
568
+ blured: (e) => {
569
+ this.dockManager.activePanel = null;
570
+ }
571
+ });
572
+ }
573
+
574
+ async close() {
575
+ this.closeInternal(true);
576
+ }
577
+
578
+ private async closeInternal(runCallback: boolean) {
579
+ let close = true;
580
+
581
+ if (!(this.elementContentContainer.parentElement === this.dockManager.config.dialogRootElement))
582
+ this.prepareForDocking();
583
+
584
+ if (this.elementContentContainer.parentElement === this.dockManager.config.dialogRootElement) {
585
+ if (!runCallback)
586
+ close = true;
587
+ else if (this.closePanelContainerCallback)
588
+ close = await this.closePanelContainerCallback(this);
589
+ else if (this.dockManager.closePanelContainerCallback)
590
+ close = await this.dockManager.closePanelContainerCallback(this);
591
+
592
+ if (close) {
593
+ this.dockManager.config.dialogRootElement.removeChild(this.elementContentContainer);
594
+
595
+ if (this.isDialog) {
596
+ if (this.floatingDialog) {
597
+ //this.floatingDialog.hide();
598
+ this.floatingDialog.close(); // fires onClose notification
599
+ }
600
+ }
601
+ else {
602
+ try {
603
+ this.dockManager.notifyOnClosePanel(this);
604
+ } catch (err) {
605
+ console.error(err);
606
+ }
607
+ this.performClose();
608
+ }
609
+ }
595
610
  }
596
- }
597
611
  }
598
- }
599
612
  }