panelPart.ts 5.0 KB
Newer Older
I
isidor 已提交
1 2 3 4 5
/*---------------------------------------------------------------------------------------------
 *  Copyright (c) Microsoft Corporation. All rights reserved.
 *  Licensed under the MIT License. See License.txt in the project root for license information.
 *--------------------------------------------------------------------------------------------*/

I
isidor 已提交
6
import 'vs/css!./media/panelPart';
I
isidor 已提交
7 8 9
import nls = require('vs/nls');
import {TPromise, Promise} from 'vs/base/common/winjs.base';
import {KeyMod, KeyCode} from 'vs/base/common/keyCodes';
I
isidor 已提交
10
import strings = require('vs/base/common/strings');
I
isidor 已提交
11
import {Action} from 'vs/base/common/actions';
I
isidor 已提交
12
import {Builder} from 'vs/base/browser/builder';
I
isidor 已提交
13
import {Registry} from 'vs/platform/platform';
I
isidor 已提交
14 15
import {SyncActionDescriptor} from 'vs/platform/actions/common/actions';
import {IWorkbenchActionRegistry, Extensions as WorkbenchExtensions} from 'vs/workbench/common/actionRegistry';
I
isidor 已提交
16 17 18 19 20 21 22 23 24 25 26
import {IPanel} from 'vs/workbench/common/panel';
import {EventType as WorkbenchEventType, CompositeEvent} from 'vs/workbench/common/events';
import {CompositePart} from 'vs/workbench/browser/parts/compositePart';
import {Panel, PanelRegistry, Extensions as PanelExtensions} from 'vs/workbench/browser/panel';
import {IPanelService} from 'vs/workbench/services/panel/common/panelService';
import {IPartService} from 'vs/workbench/services/part/common/partService';
import {IStorageService, StorageScope} from 'vs/platform/storage/common/storage';
import {IContextMenuService} from 'vs/platform/contextview/browser/contextView';
import {IEventService} from 'vs/platform/event/common/event';
import {IMessageService, Severity} from 'vs/platform/message/common/message';
import {ITelemetryService} from 'vs/platform/telemetry/common/telemetry';
I
isidor 已提交
27
import {IWorkspaceContextService} from 'vs/workbench/services/workspace/common/contextService';
I
isidor 已提交
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
import {IKeybindingService} from 'vs/platform/keybinding/common/keybindingService';

export class PanelPart extends CompositePart<Panel> implements IPanelService {

	public static activePanelSettingsKey = 'workbench.panelpart.activepanelid';

	public serviceId = IPanelService;
	private blockOpeningPanel: boolean;

	constructor(
		messageService: IMessageService,
		storageService: IStorageService,
		eventService: IEventService,
		telemetryService: ITelemetryService,
		contextMenuService: IContextMenuService,
		partService: IPartService,
		keybindingService: IKeybindingService,
		id: string
	) {
		super(messageService, storageService, eventService, telemetryService, contextMenuService, partService, keybindingService,
48
			(<PanelRegistry>Registry.as(PanelExtensions.Panels)), PanelPart.activePanelSettingsKey, 'panel', 'panel', id);
I
isidor 已提交
49 50 51 52 53 54 55
	}

	public openPanel(id: string, focus?: boolean): TPromise<Panel> {
		if (this.blockOpeningPanel) {
			return TPromise.as(null); // Workaround against a potential race condition
		}

56
		// First check if panel is hidden and show if so
I
isidor 已提交
57
		if (this.partService.isPanelHidden()) {
I
isidor 已提交
58 59
			try {
				this.blockOpeningPanel = true;
I
isidor 已提交
60
				this.partService.setPanelHidden(false);
I
isidor 已提交
61 62 63 64 65
			} finally {
				this.blockOpeningPanel = false;
			}
		}

66
		return this.openComposite(id, focus);
I
isidor 已提交
67 68
	}

I
isidor 已提交
69 70 71
	public createTitleArea(parent: Builder): Builder {
		const result = super.createTitleArea(parent);
		result.addClass('monaco-editor-background');
I
isidor 已提交
72

I
isidor 已提交
73 74 75
		return result;
	}

I
isidor 已提交
76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
	private get activePanel(): IPanel {
		return this.getActivePanel();
	}

	private createPanel(id: string, isActive?: boolean): TPromise<Panel> {
		return this.createComposite(id, isActive);
	}

	private showPanel(panel: Panel): TPromise<void> {
		return this.showComposite(panel);
	}

	public getActivePanel(): IPanel {
		return this.getActiveComposite();
	}

	public getLastActivePanelId(): string {
		return this.getLastActiveCompositetId();
	}

	public hideActivePanel(): TPromise<void> {
		return this.hideActiveComposite();
	}
}
I
isidor 已提交
100 101 102


export class ClosePanelAction extends Action {
I
isidor 已提交
103
	static ID = 'workbench.action.closePanel';
I
isidor 已提交
104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
	static LABEL = nls.localize('closePanel', "Close");

	constructor(
		id: string,
		name: string,
		@IPartService private partService: IPartService
	) {
		super(id, name, 'close-editor-action');
	}

	public run(): Promise {
		this.partService.setPanelHidden(true);
		return Promise.as(true);
	}
}

export class TogglePanelAction extends Action {
I
isidor 已提交
121
	static ID = 'workbench.action.togglePanel';
I
isidor 已提交
122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
	static LABEL = nls.localize('togglePanel', "Toggle Panel Visibility");

	constructor(
		id: string,
		name: string,
		@IPartService private partService: IPartService,
		@IWorkspaceContextService contextService: IWorkspaceContextService
	) {
		super(id, name, null, !!contextService.getWorkspace());
	}

	public run(): Promise {
		this.partService.setPanelHidden(!this.partService.isPanelHidden());
		return Promise.as(true);
	}
}

Registry.add(PanelExtensions.Panels, new PanelRegistry());
let actionRegistry = <IWorkbenchActionRegistry>Registry.as(WorkbenchExtensions.WorkbenchActions);
actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(TogglePanelAction, TogglePanelAction.ID, TogglePanelAction.LABEL, { primary: KeyMod.CtrlCmd | KeyCode.KEY_L }), nls.localize('view', "View"));