Files
vscode/src/vs/platform/contextview/browser/contextViewService.ts
T
Benjamin Pasero 9e0bd20b88 aux window - introduce active'ness to layout service and adopt (#196824)
* aux window - introduce active'ness to layout service and adopt

* 💄

* 💄
2023-10-27 15:40:33 +02:00

76 lines
2.6 KiB
TypeScript

/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { ContextView, ContextViewDOMPosition } from 'vs/base/browser/ui/contextview/contextview';
import { Disposable, IDisposable, toDisposable } from 'vs/base/common/lifecycle';
import { ILayoutService } from 'vs/platform/layout/browser/layoutService';
import { IContextViewDelegate, IContextViewService } from './contextView';
export class ContextViewService extends Disposable implements IContextViewService {
declare readonly _serviceBrand: undefined;
private currentViewDisposable: IDisposable = Disposable.None;
private contextView: ContextView;
private container: HTMLElement | null;
private shadowRoot: boolean | undefined;
constructor(
@ILayoutService private readonly layoutService: ILayoutService
) {
super();
this.container = layoutService.hasContainer ? layoutService.container : null;
this.contextView = this._register(new ContextView(this.container, ContextViewDOMPosition.ABSOLUTE));
this.layout();
this._register(layoutService.onDidLayoutMainContainer(() => this.layout()));
}
// ContextView
private setContainer(container: HTMLElement, domPosition?: ContextViewDOMPosition): void {
this.contextView.setContainer(container, domPosition || ContextViewDOMPosition.ABSOLUTE);
}
showContextView(delegate: IContextViewDelegate, container?: HTMLElement, shadowRoot?: boolean): IDisposable {
if (container) {
if (container !== this.container || this.shadowRoot !== shadowRoot) {
this.container = container;
this.setContainer(container, shadowRoot ? ContextViewDOMPosition.FIXED_SHADOW : ContextViewDOMPosition.FIXED);
}
} else {
if (this.layoutService.hasContainer && this.container !== this.layoutService.activeContainer) {
this.container = this.layoutService.activeContainer;
this.setContainer(this.container, ContextViewDOMPosition.ABSOLUTE);
}
}
this.shadowRoot = shadowRoot;
this.contextView.show(delegate);
const disposable = toDisposable(() => {
if (this.currentViewDisposable === disposable) {
this.hideContextView();
}
});
this.currentViewDisposable = disposable;
return disposable;
}
getContextViewElement(): HTMLElement {
return this.contextView.getViewElement();
}
layout(): void {
this.contextView.layout();
}
hideContextView(data?: any): void {
this.contextView.hide(data);
}
}