dock-spawn-ts 3.11.2 → 3.12.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/src/Dialog.ts CHANGED
@@ -1,14 +1,15 @@
1
1
  import { DockManager } from "./DockManager.js";
2
- import { Point } from "./Point.js";
3
- import { PanelContainer } from "./PanelContainer.js";
2
+ import { DockNode } from "./DockNode.js";
4
3
  import { DraggableContainer } from "./DraggableContainer.js";
5
- import { ResizableContainer } from "./ResizableContainer.js";
6
4
  import { EventHandler } from "./EventHandler.js";
5
+ import { PanelContainer } from "./PanelContainer.js";
6
+ import { Point } from "./Point.js";
7
+ import { ResizableContainer } from "./ResizableContainer.js";
7
8
  import { Utils } from "./Utils.js";
8
9
  import { Localizer } from "./i18n/Localizer.js";
9
- import { DockNode } from "./DockNode.js";
10
+ import { IContextMenuProvider } from "./interfaces/IContextMenuProvider.js";
10
11
 
11
- export class Dialog {
12
+ export class Dialog implements IContextMenuProvider {
12
13
  elementDialog: HTMLDivElement & { floatingDialog: Dialog };
13
14
  draggable: DraggableContainer;
14
15
  panel: PanelContainer;
@@ -24,9 +25,6 @@ export class Dialog {
24
25
  keyPressHandler: EventHandler;
25
26
  focusHandler: EventHandler;
26
27
  grayoutParent: PanelContainer;
27
- contextmenuHandler: EventHandler;
28
- _ctxMenu: HTMLDivElement;
29
- _windowsContextMenuCloseBound: any;
30
28
 
31
29
  constructor(panel: PanelContainer, dockManager: DockManager, grayoutParent?: PanelContainer, disableResize?: boolean) {
32
30
  this.panel = panel;
@@ -64,7 +62,6 @@ export class Dialog {
64
62
  this.focusHandler = new EventHandler(this.elementDialog, 'focus', this.onFocus.bind(this), true);
65
63
  this.mouseDownHandler = new EventHandler(this.elementDialog, 'pointerdown', this.onMouseDown.bind(this), true);
66
64
  this.keyPressHandler = new EventHandler(this.elementDialog, 'keypress', this.dockManager.onKeyPressBound, true);
67
- this.contextmenuHandler = new EventHandler(this.panel.elementTitle, 'contextmenu', this.oncontextMenuClicked.bind(this));
68
65
 
69
66
  this.resize(this.panel.elementPanel.clientWidth, this.panel.elementPanel.clientHeight);
70
67
  this.isHidden = false;
@@ -113,15 +110,12 @@ export class Dialog {
113
110
  this.keyPressHandler.cancel();
114
111
  delete this.keyPressHandler;
115
112
  }
116
- if (this.contextmenuHandler) {
117
- this.contextmenuHandler.cancel();
118
- delete this.contextmenuHandler;
119
- }
113
+
120
114
  Utils.removeNode(this.elementDialog);
121
115
  this.draggable.removeDecorator();
122
116
  Utils.removeNode(this.panel.elementPanel);
123
117
  Utils.arrayRemove(this.dockManager.context.model.dialogs, this);
124
- delete this.panel.floatingDialog;
118
+ this.panel.floatingDialog = undefined;
125
119
 
126
120
  if (this.grayoutParent) {
127
121
  this.grayoutParent.grayOut(false);
@@ -192,8 +186,8 @@ export class Dialog {
192
186
  result.push(btnCloseDialog);
193
187
 
194
188
  btnCloseDialog.onclick = () => {
189
+ dialog.panel.closeContextMenu();
195
190
  dialog.panel.close();
196
- dialog.closeContextMenu();
197
191
  };
198
192
 
199
193
  if (dialog.dockManager.config.enableBrowserWindows) {
@@ -202,55 +196,17 @@ export class Dialog {
202
196
  result.push(btnNewBrowserWindow);
203
197
 
204
198
  btnNewBrowserWindow.onclick = () => {
199
+ dialog.panel.closeContextMenu();
205
200
  dialog.panel.undockToBrowserDialog();
206
- dialog.closeContextMenu();
207
201
  };
208
202
  }
209
203
 
210
204
  return result;
211
205
  }
212
206
 
213
- oncontextMenuClicked(e: MouseEvent) {
214
- e.preventDefault();
215
-
216
- if (!this._ctxMenu && Dialog.createContextMenuContentCallback) {
217
- const menuItems = Dialog.createContextMenuContentCallback(
218
- this,
219
- this.dockManager.context.model.documentManagerNode.children
220
- );
221
-
222
- if (menuItems.length == 0) {
223
- return;
224
- }
225
-
226
- this._ctxMenu = document.createElement('div');
227
- this._ctxMenu.className = 'dockspab-tab-handle-context-menu';
228
- this._ctxMenu.append(...menuItems);
229
- this._ctxMenu.style.left = e.pageX + "px";
230
- this._ctxMenu.style.top = e.pageY + "px";
231
- document.body.appendChild(this._ctxMenu);
232
- this._windowsContextMenuCloseBound = this.windowsContextMenuClose.bind(this)
233
- window.addEventListener('pointerup', this._windowsContextMenuCloseBound);
234
- } else {
235
- this.closeContextMenu();
236
- }
237
- }
238
-
239
- closeContextMenu() {
240
- if (this._ctxMenu) {
241
- document.body.removeChild(this._ctxMenu);
242
- delete this._ctxMenu;
243
- window.removeEventListener('pointerup', this._windowsContextMenuCloseBound);
244
- }
245
- }
246
-
247
- windowsContextMenuClose(e: Event) {
248
- let cp = e.composedPath();
249
- for (let i in cp) {
250
- let el = cp[i];
251
- if (el == this._ctxMenu)
252
- return;
253
- }
254
- this.closeContextMenu();
207
+ public createContextMenuItems(): Node[] {
208
+ return Dialog.createContextMenuContentCallback(
209
+ this,
210
+ this.dockManager.context.model.documentManagerNode.children);
255
211
  }
256
212
  }
@@ -1,23 +1,24 @@
1
- import { DockManager } from "./DockManager.js";
2
- import { Utils } from "./Utils.js";
3
- import { UndockInitiator } from "./UndockInitiator.js";
1
+ import { moveElementToNewBrowserWindow } from "./BrowserDialogHelper.js";
4
2
  import { ContainerType } from "./ContainerType.js";
3
+ import { Dialog } from "./Dialog.js";
4
+ import { DockManager } from "./DockManager.js";
5
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
6
  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
7
  import { TabPage } from './TabPage.js';
8
+ import { UndockInitiator } from "./UndockInitiator.js";
9
+ import { Utils } from "./Utils.js";
10
+ import { PanelType } from "./enums/PanelType.js";
14
11
  import { Localizer } from "./i18n/Localizer.js";
15
- import { moveElementToNewBrowserWindow } from "./BrowserDialogHelper.js";
12
+ import { IContextMenuProvider } from "./interfaces/IContextMenuProvider.js";
13
+ import { IDockContainer } from "./interfaces/IDockContainer.js";
14
+ import { IDockContainerWithSize } from "./interfaces/IDockContainerWithSize.js";
15
+ import { ISize } from "./interfaces/ISize.js";
16
+ import { IState } from "./interfaces/IState.js";
16
17
 
17
18
  /**
18
19
  * This dock container wraps the specified element on a panel frame with a title bar and close button
19
20
  */
20
- export class PanelContainer implements IDockContainerWithSize {
21
+ export class PanelContainer implements IDockContainerWithSize, IContextMenuProvider {
21
22
 
22
23
  public closePanelContainerCallback: (panelContainer: PanelContainer) => Promise<boolean>;
23
24
 
@@ -60,6 +61,7 @@ export class PanelContainer implements IDockContainerWithSize {
60
61
  _hideCloseButton: boolean;
61
62
  _grayOut: HTMLDivElement;
62
63
  _ctxMenu: HTMLDivElement;
64
+ private _contextMenuProvider: IContextMenuProvider;
63
65
 
64
66
  constructor(elementContent: HTMLElement, dockManager: DockManager, title?: string, panelType?: PanelType, hideCloseButton?: boolean) {
65
67
  if (!title)
@@ -104,6 +106,7 @@ export class PanelContainer implements IDockContainerWithSize {
104
106
  this._canUndock = dockManager._undockEnabled;
105
107
  this.eventListeners = [];
106
108
  this._hideCloseButton = hideCloseButton;
109
+ this._contextMenuProvider = this;
107
110
  this.windowsContextMenuClose = this.windowsContextMenuClose.bind(this);
108
111
 
109
112
  this._initialize();
@@ -162,7 +165,7 @@ export class PanelContainer implements IDockContainerWithSize {
162
165
  this._updateTitle();
163
166
 
164
167
  this.undockInitiator = new UndockInitiator(this.elementTitle, this.performUndockToDialog.bind(this));
165
- delete this.floatingDialog;
168
+ this.floatingDialog = undefined;
166
169
 
167
170
  this.mouseDownHandler = new EventHandler(this.elementPanel, 'mousedown', this.onMouseDown.bind(this));
168
171
  this.touchDownHandler = new EventHandler(this.elementPanel, 'touchstart', this.onMouseDown.bind(this), { passive: true });
@@ -190,11 +193,15 @@ export class PanelContainer implements IDockContainerWithSize {
190
193
  return result;
191
194
  }
192
195
 
196
+ public createContextMenuItems(): Node[] {
197
+ return PanelContainer.createContextMenuContentCallback(this);
198
+ }
199
+
193
200
  oncontextMenuClicked(e: MouseEvent) {
194
201
  e.preventDefault();
195
202
 
196
- if (!this._ctxMenu && PanelContainer.createContextMenuContentCallback) {
197
- const menuItems = PanelContainer.createContextMenuContentCallback(this);
203
+ if (!this._ctxMenu) {
204
+ const menuItems = this._contextMenuProvider.createContextMenuItems();
198
205
 
199
206
  if (menuItems.length == 0) {
200
207
  return;
@@ -255,6 +262,7 @@ export class PanelContainer implements IDockContainerWithSize {
255
262
  this._floatingDialog = value;
256
263
  let canUndock = (this._floatingDialog === undefined);
257
264
  this.undockInitiator.enabled = canUndock;
265
+ this._contextMenuProvider = value ?? this;
258
266
  }
259
267
 
260
268
  static async loadFromState(state: IState, dockManager: DockManager) {
package/src/index.ts CHANGED
@@ -3,6 +3,7 @@ export * from './enums/TabHostDirection.js';
3
3
  export * from './enums/WheelTypes.js';
4
4
  export * from './i18n/Defaults.js';
5
5
  export * from './i18n/Localizer.js';
6
+ export * from './interfaces/IContextMenuProvider.js';
6
7
  export * from './interfaces/IDockContainer.js';
7
8
  export * from './interfaces/IDockContainerWithSize.js';
8
9
  export * from './interfaces/ILayoutEventListener.js';
@@ -0,0 +1,3 @@
1
+ export interface IContextMenuProvider {
2
+ createContextMenuItems(): Node[];
3
+ }