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.
- package/lib/es5/dock-spawn-ts.js +1 -1
- package/lib/js/PanelContainer.d.ts +7 -1
- package/lib/js/PanelContainer.js +98 -51
- package/lib/js/PanelContainer.js.map +1 -1
- package/lib/js/TabHandle.js +3 -3
- package/lib/js/TabHandle.js.map +1 -1
- package/lib/js/webcomponent/DockSpawnTsWebcomponent.js +13 -2
- package/lib/js/webcomponent/DockSpawnTsWebcomponent.js.map +1 -1
- package/package.json +5 -5
- package/src/PanelContainer.ts +118 -62
- package/src/TabHandle.ts +7 -7
- package/src/webcomponent/DockSpawnTsWebcomponent.ts +14 -2
package/src/PanelContainer.ts
CHANGED
|
@@ -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
|
-
|
|
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.
|
|
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
|
|
37
|
+
static style = css`
|
|
38
|
+
:host {
|
|
27
39
|
display: block;
|
|
28
40
|
}`;
|
|
29
41
|
|