outputActions.ts 4.7 KB
Newer Older
E
Erich Gamma 已提交
1 2 3 4 5 6
/*---------------------------------------------------------------------------------------------
 *  Copyright (c) Microsoft Corporation. All rights reserved.
 *  Licensed under the MIT License. See License.txt in the project root for license information.
 *--------------------------------------------------------------------------------------------*/
'use strict';

7
import {TPromise} from 'vs/base/common/winjs.base';
E
Erich Gamma 已提交
8 9 10 11
import nls = require('vs/nls');
import {Registry} from 'vs/platform/platform';
import arrays = require('vs/base/common/arrays');
import {IAction, Action} from 'vs/base/common/actions';
A
Alex Dima 已提交
12 13
import {EditorAction} from 'vs/editor/common/editorAction';
import {Behaviour} from 'vs/editor/common/editorActionEnablement';
E
Erich Gamma 已提交
14
import {ICommonCodeEditor, IEditorActionDescriptorData} from 'vs/editor/common/editorCommon';
I
isidor 已提交
15
import {IOutputChannelRegistry, Extensions, IOutputService, OUTPUT_MODE_ID, OUTPUT_PANEL_ID} from 'vs/workbench/parts/output/common/output';
16
import {OutputEditorInput} from 'vs/workbench/parts/output/common/outputEditorInput';
E
Erich Gamma 已提交
17
import {SelectActionItem} from 'vs/base/browser/ui/actionbar/actionbar';
18 19
import {IPartService} from 'vs/workbench/services/part/common/partService';
import {IPanelService} from 'vs/workbench/services/panel/common/panelService';
E
Erich Gamma 已提交
20 21 22 23 24 25 26 27

export class ToggleOutputAction extends Action {

	public static ID = 'workbench.action.output.toggleOutput';
	public static LABEL = nls.localize('toggleOutput', "Toggle Output");

	constructor(
		id: string, label: string,
28 29 30
		@IPartService private partService: IPartService,
		@IPanelService private panelService: IPanelService,
		@IOutputService private outputService: IOutputService
E
Erich Gamma 已提交
31 32 33 34
	) {
		super(id, label);
	}

35
	public run(event?: any): TPromise<any> {
36 37 38
		const panel = this.panelService.getActivePanel();
		if (panel && panel.getId() === OUTPUT_PANEL_ID) {
			this.partService.setPanelHidden(true);
E
Erich Gamma 已提交
39

A
Alex Dima 已提交
40
			return TPromise.as(null);
E
Erich Gamma 已提交
41 42
		}

I
isidor 已提交
43
		return this.outputService.showOutput(this.outputService.getActiveChannel());
E
Erich Gamma 已提交
44 45 46
	}
}

I
isidor 已提交
47
export class ClearOutputAction extends Action {
E
Erich Gamma 已提交
48

B
Benjamin Pasero 已提交
49 50 51 52
	constructor(
		@IOutputService private outputService: IOutputService,
		@IPanelService private panelService: IPanelService
	) {
E
Erich Gamma 已提交
53 54 55
		super('workbench.output.action.clearOutput', nls.localize('clearOutput', "Clear Output"), 'output-action clear-output');
	}

56
	public run(): TPromise<any> {
I
isidor 已提交
57
		this.outputService.clearOutput(this.outputService.getActiveChannel());
B
Benjamin Pasero 已提交
58 59
		this.panelService.getActivePanel().focus();

A
Alex Dima 已提交
60
		return TPromise.as(true);
E
Erich Gamma 已提交
61 62 63 64 65 66 67 68 69 70
	}
}

export class ClearOutputEditorAction extends EditorAction {

	public static ID = 'editor.action.clearoutput';

	constructor(
		descriptor: IEditorActionDescriptorData,
		editor: ICommonCodeEditor,
71
		@IOutputService private outputService: IOutputService
E
Erich Gamma 已提交
72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
	) {
		super(descriptor, editor, Behaviour.WidgetFocus | Behaviour.ShowInContextMenu);
	}

	public getGroupId(): string {
		return 'clear';
	}

	public isSupported(): boolean {
		let model = this.editor.getModel();
		let mode = model && model.getMode();

		return mode && mode.getId() === OUTPUT_MODE_ID && super.isSupported();
	}

	public run(): TPromise<boolean> {
88
		this.outputService.clearOutput(this.outputService.getActiveChannel());
E
Erich Gamma 已提交
89 90 91 92
		return TPromise.as(false);
	}
}

I
isidor 已提交
93
export class SwitchOutputAction extends Action {
E
Erich Gamma 已提交
94 95 96

	public static ID = 'workbench.output.action.switchBetweenOutputs';

I
isidor 已提交
97
	constructor(@IOutputService private outputService: IOutputService) {
E
Erich Gamma 已提交
98 99 100 101 102
		super(SwitchOutputAction.ID, nls.localize('switchToOutput.label', "Switch to Output"));

		this.class = 'output-action switch-to-output';
	}

103
	public run(channel?: string): TPromise<any> {
E
Erich Gamma 已提交
104 105 106 107 108 109 110 111 112 113 114
		return this.outputService.showOutput(channel);
	}
}

export class SwitchOutputActionItem extends SelectActionItem {
	private input: OutputEditorInput;

	constructor(
		action: IAction,
		@IOutputService private outputService: IOutputService
	) {
I
isidor 已提交
115
		super(null, action, SwitchOutputActionItem.getChannels(outputService), Math.max(0, SwitchOutputActionItem.getChannels(outputService).indexOf(outputService.getActiveChannel())));
I
isidor 已提交
116 117
		this.toDispose.push(this.outputService.onOutputChannel(this.onOutputChannel, this));
		this.toDispose.push(this.outputService.onActiveOutputChannel(this.onOutputChannel, this));
E
Erich Gamma 已提交
118 119 120
	}

	private onOutputChannel(): void {
I
isidor 已提交
121
		let channels = SwitchOutputActionItem.getChannels(this.outputService);
I
isidor 已提交
122
		let selected = Math.max(0, channels.indexOf(this.outputService.getActiveChannel()));
E
Erich Gamma 已提交
123 124 125 126

		this.setOptions(channels, selected);
	}

I
isidor 已提交
127
	private static getChannels(outputService: IOutputService): string[] {
E
Erich Gamma 已提交
128 129 130 131 132 133 134 135 136 137
		const contributedChannels = (<IOutputChannelRegistry>Registry.as(Extensions.OutputChannels)).getChannels();
		const usedChannels = outputService.getChannels();

		return arrays.distinct(contributedChannels.concat(usedChannels)).sort(); // sort by name
	}

	public dispose(): void {
		super.dispose();
		delete this.input;
	}
I
isidor 已提交
138
}