dock-spawn-ts 3.0.1 → 3.1.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.
@@ -49,6 +49,7 @@ export class PanelContainer implements IDockContainerWithSize {
49
49
  panelType: PanelType;
50
50
  tabPage?: TabPage;
51
51
  undockedToNewBrowserWindow = false;
52
+ contextMenuHandler: EventHandler;
52
53
 
53
54
  lastDialogSize?: ISize;
54
55
 
@@ -58,6 +59,7 @@ export class PanelContainer implements IDockContainerWithSize {
58
59
  _cachedHeight: number;
59
60
  _hideCloseButton: boolean;
60
61
  _grayOut: HTMLDivElement;
62
+ _ctxMenu: HTMLDivElement;
61
63
 
62
64
  constructor(elementContent: HTMLElement, dockManager: DockManager, title?: string, panelType?: PanelType, hideCloseButton?: boolean) {
63
65
  if (!title)
@@ -102,9 +104,122 @@ export class PanelContainer implements IDockContainerWithSize {
102
104
  this._canUndock = dockManager._undockEnabled;
103
105
  this.eventListeners = [];
104
106
  this._hideCloseButton = hideCloseButton;
107
+ this.windowsContextMenuClose = this.windowsContextMenuClose.bind(this);
108
+
105
109
  this._initialize();
106
110
  }
107
111
 
112
+ _initialize() {
113
+ this.name = Utils.getNextId('panel_');
114
+ this.elementPanel = document.createElement('div');
115
+ this.elementPanel.tabIndex = 0;
116
+ this.elementTitle = document.createElement('div');
117
+ this.contextMenuHandler = new EventHandler(this.elementTitle, 'contextmenu', this.oncontextMenuClicked.bind(this));
118
+
119
+ this.elementTitleText = document.createElement('div');
120
+ this.elementContentHost = document.createElement('div');
121
+ this.elementButtonClose = document.createElement('div');
122
+
123
+ this.elementPanel.appendChild(this.elementTitle);
124
+ this.elementTitle.appendChild(this.elementTitleText);
125
+ this.elementTitle.appendChild(this.elementButtonClose);
126
+ this.elementButtonClose.classList.add('panel-titlebar-button-close');
127
+ this.elementButtonClose.style.display = this._hideCloseButton ? 'none' : 'block';
128
+
129
+ this.elementPanel.appendChild(this.elementContentHost);
130
+
131
+ this.elementPanel.classList.add('panel-base');
132
+ this.elementTitle.classList.add('panel-titlebar');
133
+ this.elementTitle.classList.add('disable-selection');
134
+ this.elementTitleText.classList.add('panel-titlebar-text');
135
+ this.elementContentHost.classList.add('panel-content');
136
+
137
+ // set the size of the dialog elements based on the panel's size
138
+ let panelWidth = this.elementContentContainer.clientWidth;
139
+ let panelHeight = this.elementContentContainer.clientHeight;
140
+ let titleHeight = this.elementTitle.clientHeight;
141
+
142
+ this.elementContentWrapper = document.createElement("div");
143
+ this.elementContentWrapper.classList.add('panel-content-wrapper');
144
+
145
+ this._setPanelDimensions(panelWidth, panelHeight + titleHeight);
146
+
147
+ if (!this._hideCloseButton) {
148
+ this.closeButtonClickedHandler =
149
+ new EventHandler(this.elementButtonClose, 'mousedown', this.onCloseButtonClicked.bind(this));
150
+ this.closeButtonTouchedHandler =
151
+ new EventHandler(this.elementButtonClose, 'touchstart', this.onCloseButtonClicked.bind(this));
152
+ }
153
+
154
+ Utils.removeNode(this.elementContentWrapper);
155
+ this.elementContentHost.appendChild(this.elementContentWrapper);
156
+
157
+ // Extract the title from the content element's attribute
158
+ let contentTitle = this.elementContent.dataset.panelCaption;
159
+ let contentIcon = this.elementContent.dataset.panelIcon;
160
+ if (contentTitle) this.title = contentTitle;
161
+ if (contentIcon) this.icon = contentIcon;
162
+ this._updateTitle();
163
+
164
+ this.undockInitiator = new UndockInitiator(this.elementTitle, this.performUndockToDialog.bind(this));
165
+ delete this.floatingDialog;
166
+
167
+ this.mouseDownHandler = new EventHandler(this.elementPanel, 'mousedown', this.onMouseDown.bind(this));
168
+ this.touchDownHandler = new EventHandler(this.elementPanel, 'touchstart', this.onMouseDown.bind(this), { passive: true });
169
+
170
+ this._resolvedElementContent = this.elementContent;
171
+ if (this.elementContent instanceof HTMLSlotElement) {
172
+ this._resolvedElementContent = <HTMLElement>this.elementContent.assignedElements()?.[0];
173
+ }
174
+ }
175
+
176
+ static createContextMenuContentCallback = (panelContainer: PanelContainer, contextMenuContainer: HTMLDivElement) => {
177
+ let btnNewBrowserWindow = document.createElement('div');
178
+ btnNewBrowserWindow.innerText = Localizer.getString('NewBrowserWindow');
179
+ contextMenuContainer.append(btnNewBrowserWindow);
180
+
181
+ btnNewBrowserWindow.onclick = () => {
182
+ panelContainer.undockToBrowserDialog();
183
+ panelContainer.closeContextMenu();
184
+ };
185
+ }
186
+
187
+ oncontextMenuClicked(e: MouseEvent) {
188
+ e.preventDefault();
189
+
190
+ if (!this._ctxMenu && PanelContainer.createContextMenuContentCallback) {
191
+ this._ctxMenu = document.createElement('div');
192
+ this._ctxMenu.className = 'dockspab-tab-handle-context-menu';
193
+
194
+ PanelContainer.createContextMenuContentCallback(this, this._ctxMenu);
195
+
196
+ this._ctxMenu.style.left = e.pageX + "px";
197
+ this._ctxMenu.style.top = e.pageY + "px";
198
+ document.body.appendChild(this._ctxMenu);
199
+ window.addEventListener('mouseup', this.windowsContextMenuClose);
200
+ } else {
201
+ this.closeContextMenu();
202
+ }
203
+ }
204
+
205
+ closeContextMenu() {
206
+ if (this._ctxMenu) {
207
+ document.body.removeChild(this._ctxMenu);
208
+ delete this._ctxMenu;
209
+ window.removeEventListener('mouseup', this.windowsContextMenuClose);
210
+ }
211
+ }
212
+
213
+ windowsContextMenuClose(e: Event) {
214
+ let cp = e.composedPath();
215
+ for (let i in cp) {
216
+ let el = cp[i];
217
+ if (el == this._ctxMenu)
218
+ return;
219
+ }
220
+ this.closeContextMenu();
221
+ }
222
+
108
223
  canUndock(state: boolean) {
109
224
  this._canUndock = state;
110
225
  this.undockInitiator.enabled = state;
@@ -202,68 +317,6 @@ export class PanelContainer implements IDockContainerWithSize {
202
317
  }
203
318
  }
204
319
 
205
- _initialize() {
206
- this.name = Utils.getNextId('panel_');
207
- this.elementPanel = document.createElement('div');
208
- this.elementPanel.tabIndex = 0;
209
- this.elementTitle = document.createElement('div');
210
- this.elementTitleText = document.createElement('div');
211
- this.elementContentHost = document.createElement('div');
212
- this.elementButtonClose = document.createElement('div');
213
-
214
- this.elementPanel.appendChild(this.elementTitle);
215
- this.elementTitle.appendChild(this.elementTitleText);
216
- this.elementTitle.appendChild(this.elementButtonClose);
217
- this.elementButtonClose.classList.add('panel-titlebar-button-close');
218
- this.elementButtonClose.style.display = this._hideCloseButton ? 'none' : 'block';
219
-
220
- this.elementPanel.appendChild(this.elementContentHost);
221
-
222
- this.elementPanel.classList.add('panel-base');
223
- this.elementTitle.classList.add('panel-titlebar');
224
- this.elementTitle.classList.add('disable-selection');
225
- this.elementTitleText.classList.add('panel-titlebar-text');
226
- this.elementContentHost.classList.add('panel-content');
227
-
228
- // set the size of the dialog elements based on the panel's size
229
- let panelWidth = this.elementContentContainer.clientWidth;
230
- let panelHeight = this.elementContentContainer.clientHeight;
231
- let titleHeight = this.elementTitle.clientHeight;
232
-
233
- this.elementContentWrapper = document.createElement("div");
234
- this.elementContentWrapper.classList.add('panel-content-wrapper');
235
-
236
- this._setPanelDimensions(panelWidth, panelHeight + titleHeight);
237
-
238
- if (!this._hideCloseButton) {
239
- this.closeButtonClickedHandler =
240
- new EventHandler(this.elementButtonClose, 'mousedown', this.onCloseButtonClicked.bind(this));
241
- this.closeButtonTouchedHandler =
242
- new EventHandler(this.elementButtonClose, 'touchstart', this.onCloseButtonClicked.bind(this));
243
- }
244
-
245
- Utils.removeNode(this.elementContentWrapper);
246
- this.elementContentHost.appendChild(this.elementContentWrapper);
247
-
248
- // Extract the title from the content element's attribute
249
- let contentTitle = this.elementContent.dataset.panelCaption;
250
- let contentIcon = this.elementContent.dataset.panelIcon;
251
- if (contentTitle) this.title = contentTitle;
252
- if (contentIcon) this.icon = contentIcon;
253
- this._updateTitle();
254
-
255
- this.undockInitiator = new UndockInitiator(this.elementTitle, this.performUndockToDialog.bind(this));
256
- delete this.floatingDialog;
257
-
258
- this.mouseDownHandler = new EventHandler(this.elementPanel, 'mousedown', this.onMouseDown.bind(this));
259
- this.touchDownHandler = new EventHandler(this.elementPanel, 'touchstart', this.onMouseDown.bind(this), { passive: true });
260
-
261
- this._resolvedElementContent = this.elementContent;
262
- if (this.elementContent instanceof HTMLSlotElement) {
263
- this._resolvedElementContent = <HTMLElement>this.elementContent.assignedElements()?.[0];
264
- }
265
- }
266
-
267
320
  onMouseDown() {
268
321
  this.dockManager.activePanel = this;
269
322
  }
@@ -287,6 +340,9 @@ export class PanelContainer implements IDockContainerWithSize {
287
340
  this.touchDownHandler.cancel();
288
341
  delete this.touchDownHandler;
289
342
  }
343
+ if (this.contextMenuHandler) {
344
+ this.contextMenuHandler.cancel();
345
+ }
290
346
 
291
347
  Utils.removeNode(this.elementPanel);
292
348
  if (this.closeButtonClickedHandler) {
package/src/TabHandle.ts CHANGED
@@ -80,6 +80,7 @@ export class TabHandle {
80
80
  this.contextMenuHandler = new EventHandler(this.elementBase, 'contextmenu', this.oncontextMenuClicked.bind(this));
81
81
  }
82
82
 
83
+ this.windowsContextMenuClose = this.windowsContextMenuClose.bind(this);
83
84
  //this.zIndexCounter = parent.host.dockManager.zIndexTabHandle;
84
85
  }
85
86
 
@@ -123,7 +124,7 @@ export class TabHandle {
123
124
  }
124
125
  tabHandle.closeContextMenu();
125
126
  };
126
-
127
+
127
128
  let btnNewBrowserWindow = document.createElement('div');
128
129
  btnNewBrowserWindow.innerText = Localizer.getString('NewBrowserWindow');
129
130
  contextMenuContainer.append(btnNewBrowserWindow);
@@ -146,8 +147,7 @@ export class TabHandle {
146
147
  this._ctxMenu.style.left = e.pageX + "px";
147
148
  this._ctxMenu.style.top = e.pageY + "px";
148
149
  document.body.appendChild(this._ctxMenu);
149
- this._windowsContextMenuCloseBound = this.windowsContextMenuClose.bind(this)
150
- window.addEventListener('mouseup', this._windowsContextMenuCloseBound);
150
+ window.addEventListener('mouseup', this.windowsContextMenuClose);
151
151
  } else {
152
152
  this.closeContextMenu();
153
153
  }
@@ -157,7 +157,7 @@ export class TabHandle {
157
157
  if (this._ctxMenu) {
158
158
  document.body.removeChild(this._ctxMenu);
159
159
  delete this._ctxMenu;
160
- window.removeEventListener('mouseup', this._windowsContextMenuCloseBound);
160
+ window.removeEventListener('mouseup', this.windowsContextMenuClose);
161
161
  }
162
162
  }
163
163
 
@@ -284,12 +284,12 @@ export class TabHandle {
284
284
  this.contextMenuHandler.cancel();
285
285
  }
286
286
 
287
- if(this.elementBase){
287
+ if (this.elementBase) {
288
288
  Utils.removeNode(this.elementBase);
289
289
  delete this.elementBase;
290
290
  }
291
-
292
- if(this.elementCloseButton){
291
+
292
+ if (this.elementCloseButton) {
293
293
  Utils.removeNode(this.elementCloseButton);
294
294
  delete this.elementCloseButton;
295
295
  }
@@ -7,9 +7,20 @@ import style1 from "../../../lib/css/dock-manager-style.css" with { type : 'css'
7
7
  //@ts-ignore
8
8
  import style2 from "../../../lib/css/dock-manager.css" with { type : 'css'}
9
9
 
10
+ function toParString(strings: TemplateStringsArray, values: any[]) {
11
+ if (strings.length === 1)
12
+ return strings.raw[0];
13
+ else {
14
+ let r = ''
15
+ for (let i = 0; i < strings.length; i++) {
16
+ r += strings[i] + (values[i] ?? '');
17
+ }
18
+ return r;
19
+ }
20
+ }
21
+
10
22
  const css = function (strings: TemplateStringsArray, ...values: any[]): CSSStyleSheet {
11
23
  const cssStyleSheet = new CSSStyleSheet();
12
- //@ts-ignore
13
24
  cssStyleSheet.replaceSync(toParString(strings, values));
14
25
  return cssStyleSheet;
15
26
  };
@@ -23,7 +34,8 @@ export class DockSpawnTsWebcomponent extends HTMLElement {
23
34
  private initialized = false;
24
35
  private elementContainerMap: Map<HTMLElement, PanelContainer> = new Map();
25
36
 
26
- static style = css`:host {
37
+ static style = css`
38
+ :host {
27
39
  display: block;
28
40
  }`;
29
41