From fd802370822b1bbd8d5eed899cdc8a50a63da436 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 15 Nov 2023 13:10:40 +0100 Subject: [PATCH] aux window - cleanup layout service (#198292) --- .../quickInput/standaloneQuickInputService.ts | 1 - .../browser/standaloneLayoutService.ts | 49 +++++++------------ .../browser/accessibilityService.ts | 6 --- .../clipboard/browser/clipboardService.ts | 10 ++-- .../contextview/browser/contextViewService.ts | 4 +- .../platform/layout/browser/layoutService.ts | 5 -- src/vs/workbench/browser/layout.ts | 1 - .../test/browser/workbenchTestServices.ts | 1 - 8 files changed, 23 insertions(+), 54 deletions(-) diff --git a/src/vs/editor/standalone/browser/quickInput/standaloneQuickInputService.ts b/src/vs/editor/standalone/browser/quickInput/standaloneQuickInputService.ts index ed1e784f348..8fbc1ec6300 100644 --- a/src/vs/editor/standalone/browser/quickInput/standaloneQuickInputService.ts +++ b/src/vs/editor/standalone/browser/quickInput/standaloneQuickInputService.ts @@ -39,7 +39,6 @@ class EditorScopedQuickInputService extends QuickInputService { const widget = contribution.widget; this.host = { _serviceBrand: undefined, - get hasContainer() { return true; }, get mainContainer() { return widget.getDomNode(); }, getContainer() { return widget.getDomNode(); }, get containers() { return [widget.getDomNode()]; }, diff --git a/src/vs/editor/standalone/browser/standaloneLayoutService.ts b/src/vs/editor/standalone/browser/standaloneLayoutService.ts index fffef7a328d..c928577670f 100644 --- a/src/vs/editor/standalone/browser/standaloneLayoutService.ts +++ b/src/vs/editor/standalone/browser/standaloneLayoutService.ts @@ -8,7 +8,7 @@ import { Event } from 'vs/base/common/event'; import { ILayoutService, ILayoutOffsetInfo } from 'vs/platform/layout/browser/layoutService'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; import { InstantiationType, registerSingleton } from 'vs/platform/instantiation/common/extensions'; -import { coalesce } from 'vs/base/common/arrays'; +import { coalesce, firstOrDefault } from 'vs/base/common/arrays'; import { mainWindow } from 'vs/base/browser/window'; class StandaloneLayoutService implements ILayoutService { @@ -20,35 +20,8 @@ class StandaloneLayoutService implements ILayoutService { readonly onDidChangeActiveContainer = Event.None; readonly onDidAddContainer = Event.None; - private _dimension?: dom.IDimension; - get mainContainerDimension(): dom.IDimension { - if (!this._dimension) { - this._dimension = dom.getClientArea(mainWindow.document.body); - } - - return this._dimension; - } - - get activeContainerDimension() { return this.mainContainerDimension; } - - readonly mainContainerOffset: ILayoutOffsetInfo = { top: 0, quickPickTop: 0 }; - readonly activeContainerOffset: ILayoutOffsetInfo = { top: 0, quickPickTop: 0 }; - - get hasContainer(): boolean { - return false; - } - get mainContainer(): HTMLElement { - // On a page, multiple editors can be created. Therefore, there are multiple containers, not - // just a single one. Please use `activeContainer` to get the current focused code editor - // and use its container if necessary. You can also instantiate `EditorScopedLayoutService` - // which implements `ILayoutService` but is not a part of the service collection because - // it is code editor instance specific. - throw new Error(`ILayoutService.mainContainer is not available in the standalone editor!`); - } - - get containers(): Iterable { - return coalesce(this._codeEditorService.listCodeEditors().map(codeEditor => codeEditor.getContainerDomNode())); + return firstOrDefault(this._codeEditorService.listCodeEditors())?.getContainerDomNode() ?? mainWindow.document.body; } get activeContainer(): HTMLElement { @@ -57,6 +30,21 @@ class StandaloneLayoutService implements ILayoutService { return activeCodeEditor?.getContainerDomNode() ?? this.mainContainer; } + get mainContainerDimension(): dom.IDimension { + return dom.getClientArea(this.mainContainer); + } + + get activeContainerDimension() { + return dom.getClientArea(this.activeContainer); + } + + readonly mainContainerOffset: ILayoutOffsetInfo = { top: 0, quickPickTop: 0 }; + readonly activeContainerOffset: ILayoutOffsetInfo = { top: 0, quickPickTop: 0 }; + + get containers(): Iterable { + return coalesce(this._codeEditorService.listCodeEditors().map(codeEditor => codeEditor.getContainerDomNode())); + } + getContainer() { return this.activeContainer; } @@ -72,9 +60,6 @@ class StandaloneLayoutService implements ILayoutService { } export class EditorScopedLayoutService extends StandaloneLayoutService { - override get hasContainer(): boolean { - return false; - } override get mainContainer(): HTMLElement { return this._container; } diff --git a/src/vs/platform/accessibility/browser/accessibilityService.ts b/src/vs/platform/accessibility/browser/accessibilityService.ts index fd632e46606..1db5b0a24e5 100644 --- a/src/vs/platform/accessibility/browser/accessibilityService.ts +++ b/src/vs/platform/accessibility/browser/accessibilityService.ts @@ -55,12 +55,6 @@ export class AccessibilityService extends Disposable implements IAccessibilitySe private initReducedMotionListeners(reduceMotionMatcher: MediaQueryList) { - if (!this._layoutService.hasContainer) { - // we can't use `ILayoutService.container` because the application - // doesn't have a single container - return; - } - this._register(addDisposableListener(reduceMotionMatcher, 'change', () => { this._systemMotionReduced = reduceMotionMatcher.matches; if (this._configMotionReduced === 'auto') { diff --git a/src/vs/platform/clipboard/browser/clipboardService.ts b/src/vs/platform/clipboard/browser/clipboardService.ts index 9db690545e2..2ca5e71ab26 100644 --- a/src/vs/platform/clipboard/browser/clipboardService.ts +++ b/src/vs/platform/clipboard/browser/clipboardService.ts @@ -65,12 +65,10 @@ export class BrowserClipboardService extends Disposable implements IClipboardSer }); }; - if (this.layoutService.hasContainer) { - this._register(Event.runAndSubscribe(this.layoutService.onDidAddContainer, ({ container, disposables }) => { - disposables.add(addDisposableListener(container, 'click', handler)); - disposables.add(addDisposableListener(container, 'keydown', handler)); - }, { container: this.layoutService.mainContainer, disposables: this._store })); - } + this._register(Event.runAndSubscribe(this.layoutService.onDidAddContainer, ({ container, disposables }) => { + disposables.add(addDisposableListener(container, 'click', handler)); + disposables.add(addDisposableListener(container, 'keydown', handler)); + }, { container: this.layoutService.mainContainer, disposables: this._store })); } async writeText(text: string, type?: string): Promise { diff --git a/src/vs/platform/contextview/browser/contextViewService.ts b/src/vs/platform/contextview/browser/contextViewService.ts index e9d5f292de1..722022651c4 100644 --- a/src/vs/platform/contextview/browser/contextViewService.ts +++ b/src/vs/platform/contextview/browser/contextViewService.ts @@ -21,7 +21,7 @@ export class ContextViewService extends Disposable implements IContextViewServic ) { super(); - this.container = layoutService.hasContainer ? layoutService.mainContainer : null; + this.container = layoutService.mainContainer; this.contextView = this._register(new ContextView(this.container, ContextViewDOMPosition.ABSOLUTE)); this.layout(); @@ -41,7 +41,7 @@ export class ContextViewService extends Disposable implements IContextViewServic this.setContainer(container, shadowRoot ? ContextViewDOMPosition.FIXED_SHADOW : ContextViewDOMPosition.FIXED); } } else { - if (this.layoutService.hasContainer && this.container !== this.layoutService.activeContainer) { + if (this.container !== this.layoutService.activeContainer) { this.setContainer(this.layoutService.activeContainer, ContextViewDOMPosition.ABSOLUTE); } } diff --git a/src/vs/platform/layout/browser/layoutService.ts b/src/vs/platform/layout/browser/layoutService.ts index 82c76f710ac..652791e9b2e 100644 --- a/src/vs/platform/layout/browser/layoutService.ts +++ b/src/vs/platform/layout/browser/layoutService.ts @@ -63,11 +63,6 @@ export interface ILayoutService { */ readonly activeContainerDimension: IDimension; - /** - * Does the application have a single container? - */ - readonly hasContainer: boolean; - /** * Main container of the application. * diff --git a/src/vs/workbench/browser/layout.ts b/src/vs/workbench/browser/layout.ts index 70128cd2831..fe52a43ecda 100644 --- a/src/vs/workbench/browser/layout.ts +++ b/src/vs/workbench/browser/layout.ts @@ -165,7 +165,6 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi //#region Properties - readonly hasContainer = true; readonly mainContainer = document.createElement('div'); get activeContainer() { return this.getContainerFromDocument(getActiveDocument()); } get containers(): Iterable { diff --git a/src/vs/workbench/test/browser/workbenchTestServices.ts b/src/vs/workbench/test/browser/workbenchTestServices.ts index 5690d4d92c4..b0c3b2bd05e 100644 --- a/src/vs/workbench/test/browser/workbenchTestServices.ts +++ b/src/vs/workbench/test/browser/workbenchTestServices.ts @@ -594,7 +594,6 @@ export class TestLayoutService implements IWorkbenchLayoutService { mainContainerOffset: ILayoutOffsetInfo = { top: 0, quickPickTop: 0 }; activeContainerOffset: ILayoutOffsetInfo = { top: 0, quickPickTop: 0 }; - hasContainer = true; mainContainer: HTMLElement = mainWindow.document.body; containers = [mainWindow.document.body]; activeContainer: HTMLElement = mainWindow.document.body;