dockview 1.4.1 → 1.5.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.
Files changed (156) hide show
  1. package/README.md +4 -195
  2. package/dist/cjs/api/component.api.d.ts +8 -3
  3. package/dist/cjs/api/component.api.js +16 -4
  4. package/dist/cjs/api/component.api.js.map +1 -1
  5. package/dist/cjs/dnd/droptarget.d.ts +1 -2
  6. package/dist/cjs/dockview/components/tab/defaultTab.d.ts +1 -0
  7. package/dist/cjs/dockview/components/tab/defaultTab.js +6 -3
  8. package/dist/cjs/dockview/components/tab/defaultTab.js.map +1 -1
  9. package/dist/cjs/dockview/components/watermark/watermark.js +3 -1
  10. package/dist/cjs/dockview/components/watermark/watermark.js.map +1 -1
  11. package/dist/cjs/dockview/defaultGroupPanelView.d.ts +1 -5
  12. package/dist/cjs/dockview/defaultGroupPanelView.js +5 -20
  13. package/dist/cjs/dockview/defaultGroupPanelView.js.map +1 -1
  14. package/dist/cjs/dockview/deserializer.d.ts +0 -12
  15. package/dist/cjs/dockview/deserializer.js +0 -52
  16. package/dist/cjs/dockview/deserializer.js.map +1 -1
  17. package/dist/cjs/dockview/dockviewComponent.d.ts +6 -8
  18. package/dist/cjs/dockview/dockviewComponent.js +84 -58
  19. package/dist/cjs/dockview/dockviewComponent.js.map +1 -1
  20. package/dist/cjs/dockview/options.d.ts +11 -1
  21. package/dist/cjs/gridview/baseComponentGridview.d.ts +4 -2
  22. package/dist/cjs/gridview/baseComponentGridview.js +1 -1
  23. package/dist/cjs/gridview/baseComponentGridview.js.map +1 -1
  24. package/dist/cjs/gridview/gridviewComponent.d.ts +1 -0
  25. package/dist/cjs/gridview/gridviewComponent.js +26 -18
  26. package/dist/cjs/gridview/gridviewComponent.js.map +1 -1
  27. package/dist/cjs/groupview/groupview.d.ts +20 -18
  28. package/dist/cjs/groupview/groupview.js +44 -41
  29. package/dist/cjs/groupview/groupview.js.map +1 -1
  30. package/dist/cjs/groupview/groupviewPanel.d.ts +2 -2
  31. package/dist/cjs/groupview/groupviewPanel.js.map +1 -1
  32. package/dist/cjs/groupview/tab.d.ts +1 -0
  33. package/dist/cjs/groupview/tab.js +3 -1
  34. package/dist/cjs/groupview/tab.js.map +1 -1
  35. package/dist/cjs/groupview/titlebar/tabsContainer.d.ts +3 -5
  36. package/dist/cjs/groupview/titlebar/tabsContainer.js +3 -5
  37. package/dist/cjs/groupview/titlebar/tabsContainer.js.map +1 -1
  38. package/dist/cjs/groupview/types.d.ts +0 -4
  39. package/dist/cjs/index.d.ts +2 -0
  40. package/dist/cjs/index.js +1 -0
  41. package/dist/cjs/index.js.map +1 -1
  42. package/dist/cjs/paneview/defaultPaneviewHeader.d.ts +3 -0
  43. package/dist/cjs/paneview/defaultPaneviewHeader.js +32 -6
  44. package/dist/cjs/paneview/defaultPaneviewHeader.js.map +1 -1
  45. package/dist/cjs/paneview/draggablePaneviewPanel.d.ts +3 -1
  46. package/dist/cjs/paneview/draggablePaneviewPanel.js +24 -9
  47. package/dist/cjs/paneview/draggablePaneviewPanel.js.map +1 -1
  48. package/dist/cjs/paneview/options.d.ts +2 -0
  49. package/dist/cjs/paneview/paneviewComponent.d.ts +14 -1
  50. package/dist/cjs/paneview/paneviewComponent.js +32 -17
  51. package/dist/cjs/paneview/paneviewComponent.js.map +1 -1
  52. package/dist/cjs/react/deserializer.js +13 -5
  53. package/dist/cjs/react/deserializer.js.map +1 -1
  54. package/dist/cjs/react/dockview/defaultTab.d.ts +4 -0
  55. package/dist/cjs/react/dockview/defaultTab.js +73 -0
  56. package/dist/cjs/react/dockview/defaultTab.js.map +1 -0
  57. package/dist/cjs/react/dockview/dockview.d.ts +5 -3
  58. package/dist/cjs/react/dockview/dockview.js +45 -3
  59. package/dist/cjs/react/dockview/dockview.js.map +1 -1
  60. package/dist/cjs/react/dockview/groupControlsRenderer.d.ts +43 -0
  61. package/dist/cjs/react/dockview/groupControlsRenderer.js +87 -0
  62. package/dist/cjs/react/dockview/groupControlsRenderer.js.map +1 -0
  63. package/dist/cjs/react/dockview/reactContentPart.d.ts +1 -16
  64. package/dist/cjs/react/dockview/reactContentPart.js +2 -18
  65. package/dist/cjs/react/dockview/reactContentPart.js.map +1 -1
  66. package/dist/cjs/react/dockview/reactHeaderPart.d.ts +2 -0
  67. package/dist/cjs/react/dockview/reactHeaderPart.js +4 -0
  68. package/dist/cjs/react/dockview/reactHeaderPart.js.map +1 -1
  69. package/dist/cjs/react/index.d.ts +2 -2
  70. package/dist/cjs/react/index.js +1 -2
  71. package/dist/cjs/react/index.js.map +1 -1
  72. package/dist/cjs/react/paneview/paneview.d.ts +2 -0
  73. package/dist/cjs/react/paneview/paneview.js +9 -0
  74. package/dist/cjs/react/paneview/paneview.js.map +1 -1
  75. package/dist/cjs/react/react.d.ts +1 -0
  76. package/dist/cjs/react/react.js +12 -2
  77. package/dist/cjs/react/react.js.map +1 -1
  78. package/dist/cjs/react/svg.d.ts +3 -0
  79. package/dist/cjs/react/svg.js +36 -0
  80. package/dist/cjs/react/svg.js.map +1 -0
  81. package/dist/cjs/splitview/splitviewComponent.d.ts +2 -0
  82. package/dist/cjs/splitview/splitviewComponent.js +20 -17
  83. package/dist/cjs/splitview/splitviewComponent.js.map +1 -1
  84. package/dist/cjs/svg.d.ts +3 -0
  85. package/dist/cjs/svg.js +44 -0
  86. package/dist/cjs/svg.js.map +1 -0
  87. package/dist/dockview.amd.js +454 -204
  88. package/dist/dockview.amd.min.js +2 -2
  89. package/dist/dockview.amd.min.noStyle.js +2 -2
  90. package/dist/dockview.amd.noStyle.js +453 -203
  91. package/dist/dockview.cjs.js +454 -204
  92. package/dist/dockview.esm.js +449 -198
  93. package/dist/dockview.esm.min.js +2 -2
  94. package/dist/dockview.js +454 -204
  95. package/dist/dockview.min.js +2 -2
  96. package/dist/dockview.min.noStyle.js +2 -2
  97. package/dist/dockview.noStyle.js +453 -203
  98. package/dist/esm/api/component.api.d.ts +8 -3
  99. package/dist/esm/api/component.api.js +16 -4
  100. package/dist/esm/dnd/droptarget.d.ts +1 -2
  101. package/dist/esm/dockview/components/tab/defaultTab.d.ts +1 -0
  102. package/dist/esm/dockview/components/tab/defaultTab.js +5 -2
  103. package/dist/esm/dockview/components/watermark/watermark.js +3 -1
  104. package/dist/esm/dockview/defaultGroupPanelView.d.ts +1 -5
  105. package/dist/esm/dockview/defaultGroupPanelView.js +5 -16
  106. package/dist/esm/dockview/deserializer.d.ts +0 -12
  107. package/dist/esm/dockview/deserializer.js +1 -27
  108. package/dist/esm/dockview/dockviewComponent.d.ts +6 -8
  109. package/dist/esm/dockview/dockviewComponent.js +56 -41
  110. package/dist/esm/dockview/options.d.ts +11 -1
  111. package/dist/esm/gridview/baseComponentGridview.d.ts +4 -2
  112. package/dist/esm/gridview/baseComponentGridview.js +1 -1
  113. package/dist/esm/gridview/gridviewComponent.d.ts +1 -0
  114. package/dist/esm/gridview/gridviewComponent.js +15 -7
  115. package/dist/esm/groupview/groupview.d.ts +20 -18
  116. package/dist/esm/groupview/groupview.js +42 -40
  117. package/dist/esm/groupview/groupviewPanel.d.ts +2 -2
  118. package/dist/esm/groupview/tab.d.ts +1 -0
  119. package/dist/esm/groupview/tab.js +3 -1
  120. package/dist/esm/groupview/titlebar/tabsContainer.d.ts +3 -5
  121. package/dist/esm/groupview/titlebar/tabsContainer.js +3 -5
  122. package/dist/esm/groupview/types.d.ts +0 -4
  123. package/dist/esm/index.d.ts +2 -0
  124. package/dist/esm/index.js +1 -0
  125. package/dist/esm/paneview/defaultPaneviewHeader.d.ts +3 -0
  126. package/dist/esm/paneview/defaultPaneviewHeader.js +32 -6
  127. package/dist/esm/paneview/draggablePaneviewPanel.d.ts +3 -1
  128. package/dist/esm/paneview/draggablePaneviewPanel.js +24 -9
  129. package/dist/esm/paneview/options.d.ts +2 -0
  130. package/dist/esm/paneview/paneviewComponent.d.ts +14 -1
  131. package/dist/esm/paneview/paneviewComponent.js +17 -6
  132. package/dist/esm/react/deserializer.js +13 -5
  133. package/dist/esm/react/dockview/defaultTab.d.ts +4 -0
  134. package/dist/esm/react/dockview/defaultTab.js +34 -0
  135. package/dist/esm/react/dockview/dockview.d.ts +5 -3
  136. package/dist/esm/react/dockview/dockview.js +30 -1
  137. package/dist/esm/react/dockview/groupControlsRenderer.d.ts +43 -0
  138. package/dist/esm/react/dockview/groupControlsRenderer.js +68 -0
  139. package/dist/esm/react/dockview/reactContentPart.d.ts +1 -16
  140. package/dist/esm/react/dockview/reactContentPart.js +2 -14
  141. package/dist/esm/react/dockview/reactHeaderPart.d.ts +2 -0
  142. package/dist/esm/react/dockview/reactHeaderPart.js +4 -0
  143. package/dist/esm/react/index.d.ts +2 -2
  144. package/dist/esm/react/index.js +1 -2
  145. package/dist/esm/react/paneview/paneview.d.ts +2 -0
  146. package/dist/esm/react/paneview/paneview.js +9 -0
  147. package/dist/esm/react/react.d.ts +1 -0
  148. package/dist/esm/react/react.js +12 -2
  149. package/dist/esm/react/svg.d.ts +3 -0
  150. package/dist/esm/react/svg.js +7 -0
  151. package/dist/esm/splitview/splitviewComponent.d.ts +2 -0
  152. package/dist/esm/splitview/splitviewComponent.js +9 -6
  153. package/dist/esm/svg.d.ts +3 -0
  154. package/dist/esm/svg.js +31 -0
  155. package/dist/styles/dockview.css +158 -40
  156. package/package.json +2 -2
@@ -39,7 +39,7 @@ export class GridviewComponent extends BaseGrid {
39
39
  }
40
40
  updateOptions(options) {
41
41
  const hasOrientationChanged = typeof options.orientation === 'string' &&
42
- this.options.orientation !== options.orientation;
42
+ this.gridview.orientation !== options.orientation;
43
43
  this._options = Object.assign(Object.assign({}, this.options), options);
44
44
  if (hasOrientationChanged) {
45
45
  this.gridview.orientation = options.orientation;
@@ -75,13 +75,8 @@ export class GridviewComponent extends BaseGrid {
75
75
  (_a = this.activeGroup) === null || _a === void 0 ? void 0 : _a.focus();
76
76
  }
77
77
  fromJSON(serializedGridview) {
78
+ this.clear();
78
79
  const { grid, activePanel } = serializedGridview;
79
- const groups = Array.from(this._groups.values()); // reassign since group panels will mutate
80
- for (const group of groups) {
81
- group.disposable.dispose();
82
- this.doRemoveGroup(group.value, { skipActive: true });
83
- }
84
- this.gridview.clear();
85
80
  const queue = [];
86
81
  this.gridview.deserialize(grid, {
87
82
  fromJSON: (node) => {
@@ -103,6 +98,7 @@ export class GridviewComponent extends BaseGrid {
103
98
  accessor: this,
104
99
  isVisible: node.visible,
105
100
  }));
101
+ this._onDidAddGroup.fire(view);
106
102
  this.registerPanel(view);
107
103
  return view;
108
104
  },
@@ -117,6 +113,18 @@ export class GridviewComponent extends BaseGrid {
117
113
  }
118
114
  this._onDidLayoutfromJSON.fire();
119
115
  }
116
+ clear() {
117
+ const hasActiveGroup = this.activeGroup;
118
+ const groups = Array.from(this._groups.values()); // reassign since group panels will mutate
119
+ for (const group of groups) {
120
+ group.disposable.dispose();
121
+ this.doRemoveGroup(group.value, { skipActive: true });
122
+ }
123
+ if (hasActiveGroup) {
124
+ this.doSetGroupActive(undefined);
125
+ }
126
+ this.gridview.clear();
127
+ }
120
128
  movePanel(panel, options) {
121
129
  var _a;
122
130
  let relativeLocation;
@@ -1,6 +1,6 @@
1
1
  import { PanelTransfer } from '../dnd/dataTransfer';
2
2
  import { Position } from '../dnd/droptarget';
3
- import { IDockviewComponent } from '../dockview/dockviewComponent';
3
+ import { DockviewComponent } from '../dockview/dockviewComponent';
4
4
  import { Event } from '../events';
5
5
  import { IGridPanelView } from '../gridview/baseComponentGridview';
6
6
  import { IViewSize } from '../gridview/gridview';
@@ -9,11 +9,6 @@ import { PanelInitParameters, PanelUpdateEvent } from '../panel/types';
9
9
  import { IDockviewPanel } from './groupPanel';
10
10
  import { GroupPanel } from './groupviewPanel';
11
11
  import { DockviewDropTargets } from './dnd';
12
- export declare enum GroupChangeKind2 {
13
- ADD_PANEL = "ADD_PANEL",
14
- REMOVE_PANEL = "REMOVE_PANEL",
15
- PANEL_ACTIVE = "PANEL_ACTIVE"
16
- }
17
12
  export interface DndService {
18
13
  canDisplayOverlay(group: IGroupview, event: DragEvent, target: DockviewDropTargets): boolean;
19
14
  onDrop(group: IGroupview, event: DragEvent, position: Position, index?: number): void;
@@ -49,14 +44,13 @@ export interface GroupPanelViewState extends CoreGroupOptions {
49
44
  id: string;
50
45
  }
51
46
  export interface GroupviewChangeEvent {
52
- readonly kind: GroupChangeKind2;
53
- readonly panel?: IDockviewPanel;
47
+ readonly panel: IDockviewPanel;
54
48
  }
55
49
  export interface GroupviewDropEvent {
56
- nativeEvent: DragEvent;
57
- position: Position;
50
+ readonly nativeEvent: DragEvent;
51
+ readonly position: Position;
52
+ readonly index?: number;
58
53
  getData(): PanelTransfer | undefined;
59
- index?: number;
60
54
  }
61
55
  export interface IHeader {
62
56
  hidden: boolean;
@@ -70,7 +64,9 @@ export interface IGroupview extends IDisposable, IGridPanelView {
70
64
  readonly header: IHeader;
71
65
  readonly isContentFocused: boolean;
72
66
  readonly onDidDrop: Event<GroupviewDropEvent>;
73
- readonly onDidGroupChange: Event<GroupviewChangeEvent>;
67
+ readonly onDidAddPanel: Event<GroupviewChangeEvent>;
68
+ readonly onDidRemovePanel: Event<GroupviewChangeEvent>;
69
+ readonly onDidActivePanelChange: Event<GroupviewChangeEvent>;
74
70
  readonly onMove: Event<GroupMoveEvent>;
75
71
  locked: boolean;
76
72
  isPanelActive: (panel: IDockviewPanel) => boolean;
@@ -102,10 +98,11 @@ export declare class Groupview extends CompositeDisposable implements IGroupview
102
98
  private readonly tabsContainer;
103
99
  private readonly contentContainer;
104
100
  private readonly dropTarget;
105
- private _activePanel?;
101
+ private _activePanel;
106
102
  private watermark?;
107
103
  private _isGroupActive;
108
104
  private _locked;
105
+ private _control;
109
106
  private mostRecentlyUsed;
110
107
  private readonly _onDidChange;
111
108
  readonly onDidChange: Event<IViewSize | undefined>;
@@ -114,10 +111,14 @@ export declare class Groupview extends CompositeDisposable implements IGroupview
114
111
  private _panels;
115
112
  private readonly _onMove;
116
113
  readonly onMove: Event<GroupMoveEvent>;
117
- private readonly _onDidGroupChange;
118
- readonly onDidGroupChange: Event<GroupviewChangeEvent>;
119
114
  private readonly _onDidDrop;
120
115
  readonly onDidDrop: Event<GroupviewDropEvent>;
116
+ private readonly _onDidAddPanel;
117
+ readonly onDidAddPanel: Event<GroupviewChangeEvent>;
118
+ private readonly _onDidRemovePanel;
119
+ readonly onDidRemovePanel: Event<GroupviewChangeEvent>;
120
+ private readonly _onDidActivePanelChange;
121
+ readonly onDidActivePanelChange: Event<GroupviewChangeEvent>;
121
122
  get element(): HTMLElement;
122
123
  get activePanel(): IDockviewPanel | undefined;
123
124
  get locked(): boolean;
@@ -133,7 +134,7 @@ export declare class Groupview extends CompositeDisposable implements IGroupview
133
134
  get hasWatermark(): boolean;
134
135
  get header(): IHeader;
135
136
  get isContentFocused(): boolean;
136
- constructor(container: HTMLElement, accessor: IDockviewComponent, id: string, options: GroupOptions, parent: GroupPanel);
137
+ constructor(container: HTMLElement, accessor: DockviewComponent, id: string, options: GroupOptions, parent: GroupPanel);
137
138
  initialize(): void;
138
139
  indexOf(panel: IDockviewPanel): number;
139
140
  toJSON(): GroupPanelViewState;
@@ -152,14 +153,15 @@ export declare class Groupview extends CompositeDisposable implements IGroupview
152
153
  openPanel(panel: IDockviewPanel, options?: {
153
154
  index?: number;
154
155
  skipFocus?: boolean;
155
- skipSetActive?: boolean;
156
+ skipSetPanelActive?: boolean;
157
+ skipSetGroupActive?: boolean;
156
158
  }): void;
157
159
  removePanel(groupItemOrId: IDockviewPanel | string): IDockviewPanel;
158
160
  closeAllPanels(): void;
159
161
  closePanel(panel: IDockviewPanel): void;
160
162
  private doClose;
161
163
  isPanelActive(panel: IDockviewPanel): boolean;
162
- updateActions(): void;
164
+ updateActions(element: HTMLElement | undefined): void;
163
165
  setActive(isGroupActive: boolean, skipFocus?: boolean, force?: boolean): void;
164
166
  layout(width: number, height: number): void;
165
167
  private _removePanel;
@@ -7,12 +7,6 @@ import { CompositeDisposable } from '../lifecycle';
7
7
  import { ContentContainer } from './panel/content';
8
8
  import { TabsContainer } from './titlebar/tabsContainer';
9
9
  import { DockviewDropTargets } from './dnd';
10
- export var GroupChangeKind2;
11
- (function (GroupChangeKind2) {
12
- GroupChangeKind2["ADD_PANEL"] = "ADD_PANEL";
13
- GroupChangeKind2["REMOVE_PANEL"] = "REMOVE_PANEL";
14
- GroupChangeKind2["PANEL_ACTIVE"] = "PANEL_ACTIVE";
15
- })(GroupChangeKind2 || (GroupChangeKind2 = {}));
16
10
  export class Groupview extends CompositeDisposable {
17
11
  constructor(container, accessor, id, options, parent) {
18
12
  super();
@@ -31,12 +25,15 @@ export class Groupview extends CompositeDisposable {
31
25
  this._panels = [];
32
26
  this._onMove = new Emitter();
33
27
  this.onMove = this._onMove.event;
34
- this._onDidGroupChange = new Emitter();
35
- this.onDidGroupChange = this._onDidGroupChange.event;
36
28
  this._onDidDrop = new Emitter();
37
29
  this.onDidDrop = this._onDidDrop.event;
30
+ this._onDidAddPanel = new Emitter();
31
+ this.onDidAddPanel = this._onDidAddPanel.event;
32
+ this._onDidRemovePanel = new Emitter();
33
+ this.onDidRemovePanel = this._onDidRemovePanel.event;
34
+ this._onDidActivePanelChange = new Emitter();
35
+ this.onDidActivePanelChange = this._onDidActivePanelChange.event;
38
36
  this.container.classList.add('groupview');
39
- this.addDisposables(this._onMove, this._onDidGroupChange, this._onDidChange, this._onDidDrop);
40
37
  this.tabsContainer = new TabsContainer(this.accessor, this.parent, {
41
38
  tabHeight: options.tabHeight,
42
39
  });
@@ -48,7 +45,7 @@ export class Groupview extends CompositeDisposable {
48
45
  return false;
49
46
  }
50
47
  const data = getPanelData();
51
- if (data) {
48
+ if (data && data.viewId === this.accessor.id) {
52
49
  const groupHasOnePanelAndIsActiveDragElement = this._panels.length === 1 && data.groupId === this.id;
53
50
  return !groupHasOnePanelAndIsActiveDragElement;
54
51
  }
@@ -58,7 +55,7 @@ export class Groupview extends CompositeDisposable {
58
55
  container.append(this.tabsContainer.element, this.contentContainer.element);
59
56
  this.header.hidden = !!options.hideHeader;
60
57
  this.locked = !!options.locked;
61
- this.addDisposables(this._onMove, this._onDidGroupChange, this.tabsContainer.onDrop((event) => {
58
+ this.addDisposables(this._onMove, this._onDidChange, this._onDidDrop, this._onDidAddPanel, this._onDidRemovePanel, this._onDidActivePanelChange, this.tabsContainer.onDrop((event) => {
62
59
  this.handleDropEvent(event.event, Position.Center, event.index);
63
60
  }), this.contentContainer.onDidFocus(() => {
64
61
  this.accessor.doSetGroupActive(this.parent, true);
@@ -130,6 +127,15 @@ export class Groupview extends CompositeDisposable {
130
127
  // correctly initialized
131
128
  this.setActive(this.isActive, true, true);
132
129
  this.updateContainer();
130
+ if (this.accessor.options.createGroupControlElement) {
131
+ this._control = this.accessor.options.createGroupControlElement(this.parent);
132
+ this.addDisposables(this._control);
133
+ this._control.init({
134
+ containerApi: new DockviewApi(this.accessor),
135
+ api: this.parent.api,
136
+ });
137
+ this.tabsContainer.setActionElement(this._control.element);
138
+ }
133
139
  }
134
140
  indexOf(panel) {
135
141
  return this.tabsContainer.indexOf(panel.id);
@@ -210,16 +216,21 @@ export class Groupview extends CompositeDisposable {
210
216
  options.index > this.panels.length) {
211
217
  options.index = this.panels.length;
212
218
  }
213
- const skipSetActive = !!options.skipSetActive;
219
+ const skipSetPanelActive = !!options.skipSetPanelActive;
220
+ const skipSetGroupActive = !!options.skipSetGroupActive;
214
221
  // ensure the group is updated before we fire any events
215
222
  panel.updateParentGroup(this.parent, true);
216
- if (!skipSetActive && this._activePanel === panel) {
217
- this.accessor.doSetGroupActive(this.parent);
223
+ if (this._activePanel === panel) {
224
+ if (!skipSetGroupActive) {
225
+ this.accessor.doSetGroupActive(this.parent);
226
+ }
218
227
  return;
219
228
  }
220
- this.doAddPanel(panel, options.index);
221
- if (!skipSetActive) {
229
+ this.doAddPanel(panel, options.index, skipSetPanelActive);
230
+ if (!skipSetPanelActive) {
222
231
  this.doSetActivePanel(panel);
232
+ }
233
+ if (!skipSetGroupActive) {
223
234
  this.accessor.doSetGroupActive(this.parent, !!options.skipFocus);
224
235
  }
225
236
  this.updateContainer();
@@ -255,14 +266,8 @@ export class Groupview extends CompositeDisposable {
255
266
  isPanelActive(panel) {
256
267
  return this._activePanel === panel;
257
268
  }
258
- updateActions() {
259
- var _a, _b;
260
- if (this.isActive && ((_b = (_a = this._activePanel) === null || _a === void 0 ? void 0 : _a.view) === null || _b === void 0 ? void 0 : _b.actions)) {
261
- this.tabsContainer.setActionElement(this._activePanel.view.actions.element);
262
- }
263
- else {
264
- this.tabsContainer.setActionElement(undefined);
265
- }
269
+ updateActions(element) {
270
+ this.tabsContainer.setActionElement(element);
266
271
  }
267
272
  setActive(isGroupActive, skipFocus = false, force = false) {
268
273
  var _a, _b;
@@ -318,16 +323,15 @@ export class Groupview extends CompositeDisposable {
318
323
  if (this.mostRecentlyUsed.includes(panel)) {
319
324
  this.mostRecentlyUsed.splice(this.mostRecentlyUsed.indexOf(panel), 1);
320
325
  }
321
- this._onDidGroupChange.fire({
322
- kind: GroupChangeKind2.REMOVE_PANEL,
323
- panel,
324
- });
326
+ this._onDidRemovePanel.fire({ panel });
325
327
  }
326
- doAddPanel(panel, index = this.panels.length) {
328
+ doAddPanel(panel, index = this.panels.length, skipSetActive = false) {
327
329
  const existingPanel = this._panels.indexOf(panel);
328
330
  const hasExistingPanel = existingPanel > -1;
329
331
  this.tabsContainer.openPanel(panel, index);
330
- this.contentContainer.openPanel(panel);
332
+ if (!skipSetActive) {
333
+ this.contentContainer.openPanel(panel);
334
+ }
331
335
  this.tabsContainer.show();
332
336
  this.contentContainer.show();
333
337
  if (hasExistingPanel) {
@@ -336,10 +340,7 @@ export class Groupview extends CompositeDisposable {
336
340
  }
337
341
  this.updateMru(panel);
338
342
  this.panels.splice(index, 0, panel);
339
- this._onDidGroupChange.fire({
340
- kind: GroupChangeKind2.ADD_PANEL,
341
- panel,
342
- });
343
+ this._onDidAddPanel.fire({ panel });
343
344
  }
344
345
  doSetActivePanel(panel) {
345
346
  this._activePanel = panel;
@@ -347,10 +348,7 @@ export class Groupview extends CompositeDisposable {
347
348
  this.tabsContainer.setActivePanel(panel);
348
349
  panel.layout(this._width, this._height);
349
350
  this.updateMru(panel);
350
- this._onDidGroupChange.fire({
351
- kind: GroupChangeKind2.PANEL_ACTIVE,
352
- panel,
353
- });
351
+ this._onDidActivePanelChange.fire({ panel });
354
352
  }
355
353
  }
356
354
  updateMru(panel) {
@@ -360,7 +358,6 @@ export class Groupview extends CompositeDisposable {
360
358
  this.mostRecentlyUsed = [panel, ...this.mostRecentlyUsed];
361
359
  }
362
360
  updateContainer() {
363
- this.updateActions();
364
361
  toggleClass(this.container, 'empty', this.isEmpty);
365
362
  this.panels.forEach((panel) => panel.updateParentGroup(this.parent, this.isActive));
366
363
  if (this.isEmpty && !this.watermark) {
@@ -393,7 +390,12 @@ export class Groupview extends CompositeDisposable {
393
390
  canDisplayOverlay(event, target) {
394
391
  // custom overlay handler
395
392
  if (this.accessor.options.showDndOverlay) {
396
- return this.accessor.options.showDndOverlay(event, target);
393
+ return this.accessor.options.showDndOverlay({
394
+ nativeEvent: event,
395
+ target,
396
+ group: this.accessor.getPanel(this.id),
397
+ getData: getPanelData,
398
+ });
397
399
  }
398
400
  return false;
399
401
  }
@@ -1,5 +1,5 @@
1
1
  import { IFrameworkPart } from '../panel/types';
2
- import { IDockviewComponent } from '../dockview/dockviewComponent';
2
+ import { DockviewComponent } from '../dockview/dockviewComponent';
3
3
  import { GridviewPanelApi } from '../api/gridviewPanelApi';
4
4
  import { Groupview, GroupOptions, IHeader } from './groupview';
5
5
  import { GridviewPanel, IGridviewPanel } from '../gridview/gridviewPanel';
@@ -26,7 +26,7 @@ export declare class GroupPanel extends GridviewPanel implements IGroupviewPanel
26
26
  get locked(): boolean;
27
27
  set locked(value: boolean);
28
28
  get header(): IHeader;
29
- constructor(accessor: IDockviewComponent, id: string, options: GroupOptions);
29
+ constructor(accessor: DockviewComponent, id: string, options: GroupOptions);
30
30
  initialize(): void;
31
31
  setActive(isActive: boolean): void;
32
32
  layout(width: number, height: number): void;
@@ -25,6 +25,7 @@ export interface ITab {
25
25
  }
26
26
  export declare class Tab extends CompositeDisposable implements ITab {
27
27
  readonly panelId: string;
28
+ private readonly accessor;
28
29
  private readonly group;
29
30
  private readonly _element;
30
31
  private readonly droptarget;
@@ -14,6 +14,7 @@ export class Tab extends CompositeDisposable {
14
14
  constructor(panelId, accessor, group) {
15
15
  super();
16
16
  this.panelId = panelId;
17
+ this.accessor = accessor;
17
18
  this.group = group;
18
19
  this._onChanged = new Emitter();
19
20
  this.onChanged = this._onChanged.event;
@@ -24,6 +25,7 @@ export class Tab extends CompositeDisposable {
24
25
  this._element.className = 'tab';
25
26
  this._element.tabIndex = 0;
26
27
  this._element.draggable = true;
28
+ toggleClass(this.element, 'inactive-tab', true);
27
29
  this.addDisposables(new (class Handler extends DragHandler {
28
30
  constructor() {
29
31
  super(...arguments);
@@ -63,7 +65,7 @@ export class Tab extends CompositeDisposable {
63
65
  validOverlays: 'none',
64
66
  canDisplayOverlay: (event) => {
65
67
  const data = getPanelData();
66
- if (data) {
68
+ if (data && this.accessor.id === data.viewId) {
67
69
  return this.panelId !== data.panelId;
68
70
  }
69
71
  return this.group.model.canDisplayOverlay(event, DockviewDropTargets.Tab);
@@ -2,7 +2,7 @@ import { IDisposable, CompositeDisposable } from '../../lifecycle';
2
2
  import { Event } from '../../events';
3
3
  import { ITab } from '../tab';
4
4
  import { IDockviewPanel } from '../groupPanel';
5
- import { IDockviewComponent } from '../../dockview/dockviewComponent';
5
+ import { DockviewComponent } from '../../dockview/dockviewComponent';
6
6
  import { GroupPanel } from '../groupviewPanel';
7
7
  export interface TabDropIndexEvent {
8
8
  event: DragEvent;
@@ -37,8 +37,6 @@ export declare class TabsContainer extends CompositeDisposable implements ITabsC
37
37
  private readonly voidDropTarget;
38
38
  private tabs;
39
39
  private selectedIndex;
40
- private active;
41
- private activePanel;
42
40
  private actions;
43
41
  private _height;
44
42
  private _hidden;
@@ -57,10 +55,10 @@ export declare class TabsContainer extends CompositeDisposable implements ITabsC
57
55
  isActive(tab: ITab): boolean;
58
56
  at(index: number): ITab;
59
57
  indexOf(id: string): number;
60
- constructor(accessor: IDockviewComponent, group: GroupPanel, options: {
58
+ constructor(accessor: DockviewComponent, group: GroupPanel, options: {
61
59
  tabHeight?: number;
62
60
  });
63
- setActive(isGroupActive: boolean): void;
61
+ setActive(_isGroupActive: boolean): void;
64
62
  private addTab;
65
63
  delete(id: string): void;
66
64
  setActivePanel(panel: IDockviewPanel): void;
@@ -12,7 +12,6 @@ export class TabsContainer extends CompositeDisposable {
12
12
  this.group = group;
13
13
  this.tabs = [];
14
14
  this.selectedIndex = -1;
15
- this.active = false;
16
15
  this._hidden = false;
17
16
  this._onDrop = new Emitter();
18
17
  this.onDrop = this._onDrop.event;
@@ -34,7 +33,7 @@ export class TabsContainer extends CompositeDisposable {
34
33
  canDisplayOverlay: (event) => {
35
34
  var _a;
36
35
  const data = getPanelData();
37
- if (data) {
36
+ if (data && this.accessor.id === data.viewId) {
38
37
  // don't show the overlay if the tab being dragged is the last panel of this group
39
38
  return ((_a = last(this.tabs)) === null || _a === void 0 ? void 0 : _a.value.panelId) !== data.panelId;
40
39
  }
@@ -116,8 +115,8 @@ export class TabsContainer extends CompositeDisposable {
116
115
  indexOf(id) {
117
116
  return this.tabs.findIndex((tab) => tab.value.panelId === id);
118
117
  }
119
- setActive(isGroupActive) {
120
- this.active = isGroupActive;
118
+ setActive(_isGroupActive) {
119
+ // noop
121
120
  }
122
121
  addTab(tab, index = this.tabs.length) {
123
122
  if (index < 0 || index > this.tabs.length) {
@@ -178,7 +177,6 @@ export class TabsContainer extends CompositeDisposable {
178
177
  }));
179
178
  const value = { value: tabToAdd, disposable };
180
179
  this.addTab(value, index);
181
- this.activePanel = panel;
182
180
  }
183
181
  closePanel(panel) {
184
182
  this.delete(panel.id);
@@ -1,4 +1,3 @@
1
- import { IDisposable } from '../lifecycle';
2
1
  import { IDockviewComponent } from '../dockview/dockviewComponent';
3
2
  import { DockviewPanelApi } from '../api/groupPanelApi';
4
3
  import { PanelInitParameters, IPanel } from '../panel/types';
@@ -32,9 +31,6 @@ export interface ITabRenderer extends IPanel {
32
31
  init(parameters: GroupPanelPartInitParameters): void;
33
32
  updateParentGroup(group: GroupPanel, isPanelVisible: boolean): void;
34
33
  }
35
- export interface IActionsRenderer extends IDisposable {
36
- readonly element: HTMLElement;
37
- }
38
34
  export interface IContentRenderer extends IPanel {
39
35
  readonly element: HTMLElement;
40
36
  readonly actions?: HTMLElement;
@@ -6,12 +6,14 @@ export * from './groupview/groupview';
6
6
  export * from './gridview/baseComponentGridview';
7
7
  export * from './groupview/panel/content';
8
8
  export * from './groupview/tab';
9
+ export * from './groupview/dnd';
9
10
  export * from './groupview/types';
10
11
  export * from './dockview/options';
11
12
  export * from './dockview/dockviewComponent';
12
13
  export * from './gridview/gridviewComponent';
13
14
  export * from './splitview/splitviewComponent';
14
15
  export * from './paneview/paneviewComponent';
16
+ export { PaneviewComponentOptions } from './paneview/options';
15
17
  export * from './gridview/gridviewPanel';
16
18
  export * from './splitview/splitviewPanel';
17
19
  export * from './paneview/paneviewPanel';
package/dist/esm/index.js CHANGED
@@ -6,6 +6,7 @@ export * from './groupview/groupview';
6
6
  export * from './gridview/baseComponentGridview';
7
7
  export * from './groupview/panel/content';
8
8
  export * from './groupview/tab';
9
+ export * from './groupview/dnd';
9
10
  export * from './groupview/types';
10
11
  export * from './dockview/options';
11
12
  export * from './dockview/dockviewComponent';
@@ -3,6 +3,8 @@ import { CompositeDisposable } from '../lifecycle';
3
3
  import { PanelUpdateEvent } from '../panel/types';
4
4
  import { IPaneHeaderPart, PanePanelInitParameter } from './paneviewPanel';
5
5
  export declare class DefaultHeader extends CompositeDisposable implements IPaneHeaderPart {
6
+ private readonly _expandedIcon;
7
+ private readonly _collapsedIcon;
6
8
  private readonly disposable;
7
9
  private readonly _element;
8
10
  private readonly _content;
@@ -13,6 +15,7 @@ export declare class DefaultHeader extends CompositeDisposable implements IPaneH
13
15
  init(params: PanePanelInitParameter & {
14
16
  api: PaneviewPanelApiImpl;
15
17
  }): void;
18
+ private updateIcon;
16
19
  update(_params: PanelUpdateEvent): void;
17
20
  dispose(): void;
18
21
  }
@@ -1,17 +1,22 @@
1
1
  import { addDisposableListener } from '../events';
2
2
  import { CompositeDisposable, MutableDisposable } from '../lifecycle';
3
+ import { toggleClass } from '../dom';
4
+ import { createChevronRightButton, createExpandMoreButton } from '../svg';
3
5
  export class DefaultHeader extends CompositeDisposable {
4
6
  constructor() {
5
7
  super();
8
+ this._expandedIcon = createExpandMoreButton();
9
+ this._collapsedIcon = createChevronRightButton();
6
10
  this.disposable = new MutableDisposable();
7
11
  this.apiRef = { api: null };
8
12
  this._element = document.createElement('div');
9
13
  this.element.className = 'default-header';
10
14
  this._content = document.createElement('span');
11
- this._expander = document.createElement('a');
12
- this.element.appendChild(this._content);
15
+ this._expander = document.createElement('div');
16
+ this._expander.className = 'dockview-pane-header-icon';
13
17
  this.element.appendChild(this._expander);
14
- this.addDisposables(addDisposableListener(this._expander, 'click', () => {
18
+ this.element.appendChild(this._content);
19
+ this.addDisposables(addDisposableListener(this._element, 'click', () => {
15
20
  var _a;
16
21
  (_a = this.apiRef.api) === null || _a === void 0 ? void 0 : _a.setExpanded(!this.apiRef.api.isExpanded);
17
22
  }));
@@ -22,11 +27,32 @@ export class DefaultHeader extends CompositeDisposable {
22
27
  init(params) {
23
28
  this.apiRef.api = params.api;
24
29
  this._content.textContent = params.title;
25
- this._expander.textContent = params.api.isExpanded ? '<' : '>';
26
- this.disposable.value = params.api.onDidExpansionChange((e) => {
27
- this._expander.textContent = e.isExpanded ? '<' : '>';
30
+ this.updateIcon();
31
+ this.disposable.value = params.api.onDidExpansionChange(() => {
32
+ this.updateIcon();
28
33
  });
29
34
  }
35
+ updateIcon() {
36
+ var _a;
37
+ const isExpanded = !!((_a = this.apiRef.api) === null || _a === void 0 ? void 0 : _a.isExpanded);
38
+ toggleClass(this._expander, 'collapsed', !isExpanded);
39
+ if (isExpanded) {
40
+ if (this._expander.contains(this._collapsedIcon)) {
41
+ this._collapsedIcon.remove();
42
+ }
43
+ if (!this._expander.contains(this._expandedIcon)) {
44
+ this._expander.appendChild(this._expandedIcon);
45
+ }
46
+ }
47
+ else {
48
+ if (this._expander.contains(this._expandedIcon)) {
49
+ this._expandedIcon.remove();
50
+ }
51
+ if (!this._expander.contains(this._collapsedIcon)) {
52
+ this._expander.appendChild(this._collapsedIcon);
53
+ }
54
+ }
55
+ }
30
56
  update(_params) {
31
57
  //
32
58
  }
@@ -1,17 +1,19 @@
1
1
  import { PaneTransfer } from '../dnd/dataTransfer';
2
2
  import { DroptargetEvent } from '../dnd/droptarget';
3
3
  import { Orientation } from '../splitview/core/splitview';
4
+ import { IPaneviewComponent } from './paneviewComponent';
4
5
  import { IPaneviewPanel, PaneviewPanel } from './paneviewPanel';
5
6
  export interface PaneviewDropEvent2 extends DroptargetEvent {
6
7
  panel: IPaneviewPanel;
7
8
  getData: () => PaneTransfer | undefined;
8
9
  }
9
10
  export declare abstract class DraggablePaneviewPanel extends PaneviewPanel {
11
+ private readonly accessor;
10
12
  private handler;
11
13
  private target;
12
14
  private readonly _onDidDrop;
13
15
  readonly onDidDrop: import("../events").Event<PaneviewDropEvent2>;
14
- constructor(id: string, component: string, headerComponent: string | undefined, orientation: Orientation, isExpanded: boolean, disableDnd: boolean);
16
+ constructor(accessor: IPaneviewComponent, id: string, component: string, headerComponent: string | undefined, orientation: Orientation, isExpanded: boolean, disableDnd: boolean);
15
17
  private initDragFeatures;
16
18
  private onDrop;
17
19
  }
@@ -4,8 +4,9 @@ import { Droptarget, Position } from '../dnd/droptarget';
4
4
  import { Emitter } from '../events';
5
5
  import { PaneviewPanel, } from './paneviewPanel';
6
6
  export class DraggablePaneviewPanel extends PaneviewPanel {
7
- constructor(id, component, headerComponent, orientation, isExpanded, disableDnd) {
7
+ constructor(accessor, id, component, headerComponent, orientation, isExpanded, disableDnd) {
8
8
  super(id, component, headerComponent, orientation, isExpanded, true);
9
+ this.accessor = accessor;
9
10
  this._onDidDrop = new Emitter();
10
11
  this.onDidDrop = this._onDidDrop.event;
11
12
  if (!disableDnd) {
@@ -17,10 +18,11 @@ export class DraggablePaneviewPanel extends PaneviewPanel {
17
18
  return;
18
19
  }
19
20
  const id = this.id;
21
+ const accessorId = this.accessor.id;
20
22
  this.header.draggable = true;
21
23
  this.handler = new (class PaneDragHandler extends DragHandler {
22
24
  getData() {
23
- LocalSelectionTransfer.getInstance().setData([new PaneTransfer('paneview', id)], PaneTransfer.prototype);
25
+ LocalSelectionTransfer.getInstance().setData([new PaneTransfer(accessorId, id)], PaneTransfer.prototype);
24
26
  return {
25
27
  dispose: () => {
26
28
  LocalSelectionTransfer.getInstance().clearData(PaneTransfer.prototype);
@@ -30,12 +32,22 @@ export class DraggablePaneviewPanel extends PaneviewPanel {
30
32
  })(this.header);
31
33
  this.target = new Droptarget(this.element, {
32
34
  validOverlays: 'vertical',
33
- canDisplayOverlay: () => {
35
+ canDisplayOverlay: (event) => {
34
36
  const data = getPaneData();
35
- if (!data) {
36
- return true;
37
+ if (data) {
38
+ if (data.paneId !== this.id &&
39
+ data.viewId === this.accessor.id) {
40
+ return true;
41
+ }
37
42
  }
38
- return data.paneId !== this.id;
43
+ if (this.accessor.options.showDndOverlay) {
44
+ return this.accessor.options.showDndOverlay({
45
+ nativeEvent: event,
46
+ getData: getPaneData,
47
+ panel: this,
48
+ });
49
+ }
50
+ return false;
39
51
  },
40
52
  });
41
53
  this.addDisposables(this._onDidDrop, this.handler, this.target, this.target.onDrop((event) => {
@@ -44,8 +56,10 @@ export class DraggablePaneviewPanel extends PaneviewPanel {
44
56
  }
45
57
  onDrop(event) {
46
58
  const data = getPaneData();
47
- if (!data) {
48
- this._onDidDrop.fire(Object.assign(Object.assign({}, event), { panel: this, getData: () => getPaneData() }));
59
+ if (!data || data.viewId !== this.accessor.id) {
60
+ // if there is no local drag event for this panel
61
+ // or if the drag event was creating by another Paneview instance
62
+ this._onDidDrop.fire(Object.assign(Object.assign({}, event), { panel: this, getData: getPaneData }));
49
63
  return;
50
64
  }
51
65
  const containerApi = this._params
@@ -53,7 +67,8 @@ export class DraggablePaneviewPanel extends PaneviewPanel {
53
67
  const panelId = data.paneId;
54
68
  const existingPanel = containerApi.getPanel(panelId);
55
69
  if (!existingPanel) {
56
- this._onDidDrop.fire(Object.assign(Object.assign({}, event), { panel: this, getData: () => getPaneData() }));
70
+ // if the panel doesn't exist
71
+ this._onDidDrop.fire(Object.assign(Object.assign({}, event), { panel: this, getData: getPaneData }));
57
72
  return;
58
73
  }
59
74
  const allPanels = containerApi.panels;