diff --git a/src/vs/test/utils/servicesTestUtils.ts b/src/vs/test/utils/servicesTestUtils.ts index 61bebb26e11fcc5f84eeee5e1896599b8ae4cd1d..b39619fe14ec4c23c2590839c2f9a8baa26c5e3d 100644 --- a/src/vs/test/utils/servicesTestUtils.ts +++ b/src/vs/test/utils/servicesTestUtils.ts @@ -230,6 +230,10 @@ export class TestPartService implements IPartService { return true; } + public getContainer(part): HTMLElement { + return null; + } + public isStatusBarHidden(): boolean { return false; } diff --git a/src/vs/workbench/electron-browser/workbench.ts b/src/vs/workbench/electron-browser/workbench.ts index 6832aa0ba59580fa93209bd69b64bba6d79ddada..312f556882909f448f2667069a015c9ff7230aaa 100644 --- a/src/vs/workbench/electron-browser/workbench.ts +++ b/src/vs/workbench/electron-browser/workbench.ts @@ -74,7 +74,6 @@ import {MenuService} from 'vs/platform/actions/common/menuService'; import {IContextMenuService} from 'vs/platform/contextview/browser/contextView'; import {IEnvironmentService} from 'vs/platform/environment/common/environment'; import {ITelemetryService} from 'vs/platform/telemetry/common/telemetry'; -import * as watermark from 'vs/workbench/parts/watermark/watermark'; export const MessagesVisibleContext = new RawContextKey('globalMessageVisible', false); export const EditorsVisibleContext = new RawContextKey('editorIsOpen', false); @@ -470,6 +469,11 @@ export class Workbench implements IPartService { return false; } + const container = this.getContainer(part); + return DOM.isAncestor(activeElement, container); + } + + public getContainer(part: Parts): HTMLElement { let container: Builder = null; switch (part) { case Parts.ACTIVITYBAR_PART: @@ -488,8 +492,7 @@ export class Workbench implements IPartService { container = this.statusbarPart.getContainer(); break; } - - return DOM.isAncestor(activeElement, container.getHTMLElement()); + return container && container.getHTMLElement(); } public isVisible(part: Parts): boolean { @@ -783,10 +786,6 @@ export class Workbench implements IPartService { role: 'main' }); - if (this.telemetryService.getExperiments().showCommandsWatermark) { - this.toDispose.push(watermark.create(editorContainer, this.keybindingService)); - } - this.editorPart.create(editorContainer); } diff --git a/src/vs/workbench/parts/watermark/watermark.css b/src/vs/workbench/parts/watermark/browser/watermark.css similarity index 100% rename from src/vs/workbench/parts/watermark/watermark.css rename to src/vs/workbench/parts/watermark/browser/watermark.css diff --git a/src/vs/workbench/parts/watermark/browser/watermark.ts b/src/vs/workbench/parts/watermark/browser/watermark.ts new file mode 100644 index 0000000000000000000000000000000000000000..337dea4b52d39e3e1392eb02fa40447460f48d6e --- /dev/null +++ b/src/vs/workbench/parts/watermark/browser/watermark.ts @@ -0,0 +1,101 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +import 'vs/css!./watermark'; +import { $ } from 'vs/base/browser/builder'; +import { IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; +import * as nls from 'vs/nls'; +import { Parts, IPartService } from 'vs/workbench/services/part/common/partService'; +import { Registry } from 'vs/platform/platform'; +import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; +import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; +import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions } from 'vs/workbench/common/contributions'; +import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; + +const entries = [ + { + text: nls.localize('watermark.showCommands', "Command Palette"), + ids: ['workbench.action.showCommands'] + }, + { + text: nls.localize('watermark.quickOpen', "Go to File"), + ids: ['workbench.action.quickOpen'] + }, + { + text: nls.localize('watermark.moveLines', "Move Lines Up/Down"), + ids: ['editor.action.moveLinesUpAction', 'editor.action.moveLinesDownAction'] + }, + { + text: nls.localize('watermark.addCursor', "Add Cursors Above/Below"), + ids: ['editor.action.insertCursorAbove', 'editor.action.insertCursorBelow'] + }, + { + text: nls.localize('watermark.toggleTerminal', "Toggle Terminal"), + ids: ['workbench.action.terminal.toggleTerminal'] + }, +]; + +const UNBOUND = nls.localize('watermark.unboundCommand', "unbound"); + +export class WatermarkContribution implements IWorkbenchContribution { + + private toDispose: IDisposable[] = []; + + constructor( + @ILifecycleService lifecycleService: ILifecycleService, + @IPartService private partService: IPartService, + @IKeybindingService private keybindingService: IKeybindingService, + @ITelemetryService telemetryService: ITelemetryService + ) { + if (telemetryService.getExperiments().showCommandsWatermark) { + lifecycleService.onShutdown(this.dispose, this); + this.partService.joinCreation().then(() => { + this.create(); + }); + } + } + + public getId() { + return 'vs.watermark'; + } + + private create(): void { + const container = this.partService.getContainer(Parts.EDITOR_PART); + const watermark = $() + .div({ 'class': 'watermark' }); + const box = $(watermark) + .div({ 'class': 'watermark-box' }); + const update = () => { + const builder = $(box); + builder.clearChildren(); + entries.map(entry => { + builder.element('dl', {}, dl => { + dl.element('dt', {}, dt => dt.text(entry.text)); + dl.element('dd', {}, dd => dd.innerHtml( + entry.ids + .map(id => this.keybindingService.lookupKeybindings(id).slice(0, 1) + .map(k => `${this.keybindingService.getLabelFor(k)}`) + .join('') || UNBOUND) + .join(' / ') + )); + }); + }); + }; + update(); + watermark.build(container, 0); + $(container) + .addClass('has-watermark'); + this.toDispose.push(this.keybindingService.onDidUpdateKeybindings(update)); + } + + public dispose(): void { + this.toDispose = dispose(this.toDispose); + } +} + +Registry.as(WorkbenchExtensions.Workbench) + .registerWorkbenchContribution(WatermarkContribution); diff --git a/src/vs/workbench/parts/watermark/watermark.ts b/src/vs/workbench/parts/watermark/watermark.ts deleted file mode 100644 index 3edbb99419c7ecc8f8d8b324da976b16ba4ff3ba..0000000000000000000000000000000000000000 --- a/src/vs/workbench/parts/watermark/watermark.ts +++ /dev/null @@ -1,62 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -'use strict'; - -import 'vs/css!./watermark'; -import {Builder, $} from 'vs/base/browser/builder'; -import {IDisposable} from 'vs/base/common/lifecycle'; -import {IKeybindingService} from 'vs/platform/keybinding/common/keybinding'; -import * as nls from 'vs/nls'; - -const entries = [ - { - text: nls.localize('watermark.showCommands', "Command Palette"), - ids: ['workbench.action.showCommands'] - }, - { - text: nls.localize('watermark.quickOpen', "Go to File"), - ids: ['workbench.action.quickOpen'] - }, - { - text: nls.localize('watermark.moveLines', "Move Lines Up/Down"), - ids: ['editor.action.moveLinesUpAction', 'editor.action.moveLinesDownAction'] - }, - { - text: nls.localize('watermark.addCursor', "Add Cursors Above/Below"), - ids: ['editor.action.insertCursorAbove', 'editor.action.insertCursorBelow'] - }, - { - text: nls.localize('watermark.toggleTerminal', "Toggle Terminal"), - ids: ['workbench.action.terminal.toggleTerminal'] - }, -]; - -const UNBOUND = nls.localize('watermark.unboundCommand', "unbound"); - -export function create(container: Builder, keybindingService: IKeybindingService): IDisposable { - const watermark = $(container) - .addClass('has-watermark') - .div({ 'class': 'watermark' }); - const box = $(watermark) - .div({ 'class': 'watermark-box' }); - function update() { - const builder = $(box); - builder.clearChildren(); - entries.map(entry => { - builder.element('dl', {}, dl => { - dl.element('dt', {}, dt => dt.text(entry.text)); - dl.element('dd', {}, dd => dd.innerHtml( - entry.ids - .map(id => keybindingService.lookupKeybindings(id).slice(0, 1) - .map(k => `${keybindingService.getLabelFor(k)}`) - .join('') || UNBOUND) - .join(' / ') - )); - }); - }); - } - update(); - return keybindingService.onDidUpdateKeybindings(update); -} diff --git a/src/vs/workbench/services/part/common/partService.ts b/src/vs/workbench/services/part/common/partService.ts index aacd8950c5726f79763ae19f3d63c9b56fa0e062..4c935db776c3aac18a8d3c75ba0d4bfb5f2fed6a 100644 --- a/src/vs/workbench/services/part/common/partService.ts +++ b/src/vs/workbench/services/part/common/partService.ts @@ -45,6 +45,11 @@ export interface IPartService { */ hasFocus(part: Parts): boolean; + /** + * Returns the parts HTML element, if there is one. + */ + getContainer(part: Parts): HTMLElement; + /** * Returns iff the part is visible. */ diff --git a/src/vs/workbench/workbench.main.ts b/src/vs/workbench/workbench.main.ts index b7198436d14967f117b08de1e51b0ba99f6500a3..8c5d2b08734cfc74224432b1fcda118f323a48f1 100644 --- a/src/vs/workbench/workbench.main.ts +++ b/src/vs/workbench/workbench.main.ts @@ -93,3 +93,5 @@ import 'vs/workbench/electron-browser/main.contribution'; import 'vs/workbench/electron-browser/main'; import 'vs/workbench/parts/themes/test/electron-browser/themes.test.contribution'; + +import 'vs/workbench/parts/watermark/browser/watermark'; \ No newline at end of file