/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import { Event, Emitter } from 'vs/base/common/event'; import { Registry } from 'vs/platform/registry/common/platform'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { RawContextKey } from 'vs/platform/contextkey/common/contextkey'; import { URI } from 'vs/base/common/uri'; /** * Mime type used by the output editor. */ export const OUTPUT_MIME = 'text/x-code-output'; /** * Output resource scheme. */ export const OUTPUT_SCHEME = 'output'; /** * Id used by the output editor. */ export const OUTPUT_MODE_ID = 'Log'; /** * Mime type used by the log output editor. */ export const LOG_MIME = 'text/x-code-log-output'; /** * Log resource scheme. */ export const LOG_SCHEME = 'log'; /** * Id used by the log output editor. */ export const LOG_MODE_ID = 'log'; /** * Output panel id */ export const OUTPUT_PANEL_ID = 'workbench.panel.output'; export const Extensions = { OutputChannels: 'workbench.contributions.outputChannels' }; export const OUTPUT_SERVICE_ID = 'outputService'; export const MAX_OUTPUT_LENGTH = 10000 /* Max. number of output lines to show in output */ * 100 /* Guestimated chars per line */; export const CONTEXT_IN_OUTPUT = new RawContextKey('inOutput', false); export const CONTEXT_ACTIVE_LOG_OUTPUT = new RawContextKey('activeLogOutput', false); export const IOutputService = createDecorator(OUTPUT_SERVICE_ID); /** * The output service to manage output from the various processes running. */ export interface IOutputService { _serviceBrand: any; /** * Given the channel id returns the output channel instance. * Channel should be first registered via OutputChannelRegistry. */ getChannel(id: string): IOutputChannel | undefined; /** * Returns an array of all known output channels descriptors. */ getChannelDescriptors(): IOutputChannelDescriptor[]; /** * Returns the currently active channel. * Only one channel can be active at a given moment. */ getActiveChannel(): IOutputChannel | undefined; /** * Show the channel with the passed id. */ showChannel(id: string, preserveFocus?: boolean): Promise; /** * Allows to register on active output channel change. */ onActiveOutputChannel: Event; } export interface IOutputChannel { /** * Identifier of the output channel. */ id: string; /** * Label of the output channel to be displayed to the user. */ label: string; /** * Returns the value indicating whether the channel has scroll locked. */ scrollLock: boolean; /** * Appends output to the channel. */ append(output: string): void; /** * Update the channel. */ update(): void; /** * Clears all received output for this channel. */ clear(till?: number): void; /** * Disposes the output channel. */ dispose(): void; } export interface IOutputChannelDescriptor { id: string; label: string; log: boolean; file?: URI; } export interface IFileOutputChannelDescriptor extends IOutputChannelDescriptor { file: URI; } export interface IOutputChannelRegistry { readonly onDidRegisterChannel: Event; readonly onDidRemoveChannel: Event; /** * Make an output channel known to the output world. */ registerChannel(descriptor: IOutputChannelDescriptor): void; /** * Returns the list of channels known to the output world. */ getChannels(): IOutputChannelDescriptor[]; /** * Returns the channel with the passed id. */ getChannel(id: string): IOutputChannelDescriptor | undefined; /** * Remove the output channel with the passed id. */ removeChannel(id: string): void; } class OutputChannelRegistry implements IOutputChannelRegistry { private channels = new Map(); private readonly _onDidRegisterChannel = new Emitter(); readonly onDidRegisterChannel: Event = this._onDidRegisterChannel.event; private readonly _onDidRemoveChannel = new Emitter(); readonly onDidRemoveChannel: Event = this._onDidRemoveChannel.event; public registerChannel(descriptor: IOutputChannelDescriptor): void { if (!this.channels.has(descriptor.id)) { this.channels.set(descriptor.id, descriptor); this._onDidRegisterChannel.fire(descriptor.id); } } public getChannels(): IOutputChannelDescriptor[] { const result: IOutputChannelDescriptor[] = []; this.channels.forEach(value => result.push(value)); return result; } public getChannel(id: string): IOutputChannelDescriptor | undefined { return this.channels.get(id); } public removeChannel(id: string): void { this.channels.delete(id); this._onDidRemoveChannel.fire(id); } } Registry.add(Extensions.OutputChannels, new OutputChannelRegistry());