debugViewlet.ts 5.9 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.
 *--------------------------------------------------------------------------------------------*/

import 'vs/css!./media/debugViewlet';
7
import { Builder, Dimension } from 'vs/base/browser/builder';
J
Johannes Rieken 已提交
8
import { TPromise } from 'vs/base/common/winjs.base';
I
isidor 已提交
9 10 11
import * as lifecycle from 'vs/base/common/lifecycle';
import { IAction } from 'vs/base/common/actions';
import { IActionItem } from 'vs/base/browser/ui/actionbar/actionbar';
J
Johannes Rieken 已提交
12
import { SplitView } from 'vs/base/browser/ui/splitview/splitview';
I
isidor 已提交
13
import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle';
I
isidor 已提交
14
import { Scope } from 'vs/workbench/common/memento';
J
Johannes Rieken 已提交
15
import { IViewletView, Viewlet } from 'vs/workbench/browser/viewlet';
I
isidor 已提交
16
import { IDebugService, VIEWLET_ID, State } from 'vs/workbench/parts/debug/common/debug';
J
Johannes Rieken 已提交
17
import { DebugViewRegistry } from 'vs/workbench/parts/debug/browser/debugViewRegistry';
I
isidor 已提交
18 19
import { StartAction, ToggleReplAction, ConfigureAction } from 'vs/workbench/parts/debug/browser/debugActions';
import { StartDebugActionItem } from 'vs/workbench/parts/debug/browser/debugActionItems';
J
Johannes Rieken 已提交
20 21 22 23
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
import { IProgressService, IProgressRunner } from 'vs/platform/progress/common/progress';
import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace';
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
I
isidor 已提交
24
import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage';
B
Benjamin Pasero 已提交
25
import { IThemeService } from 'vs/platform/theme/common/themeService';
I
isidor 已提交
26 27

const DEBUG_VIEWS_WEIGHTS = 'debug.viewsweights';
E
Erich Gamma 已提交
28

I
isidor 已提交
29
export class DebugViewlet extends Viewlet {
E
Erich Gamma 已提交
30 31

	private toDispose: lifecycle.IDisposable[];
I
isidor 已提交
32
	private actions: IAction[];
I
isidor 已提交
33
	private startDebugActionItem: StartDebugActionItem;
E
Erich Gamma 已提交
34 35 36
	private progressRunner: IProgressRunner;
	private viewletSettings: any;

I
isidor 已提交
37
	private $el: Builder;
I
isidor 已提交
38 39
	private splitView: SplitView;
	private views: IViewletView[];
E
Erich Gamma 已提交
40 41 42 43 44 45 46

	constructor(
		@ITelemetryService telemetryService: ITelemetryService,
		@IProgressService private progressService: IProgressService,
		@IDebugService private debugService: IDebugService,
		@IInstantiationService private instantiationService: IInstantiationService,
		@IWorkspaceContextService private contextService: IWorkspaceContextService,
I
isidor 已提交
47
		@IStorageService private storageService: IStorageService,
B
Benjamin Pasero 已提交
48 49
		@ILifecycleService lifecycleService: ILifecycleService,
		@IThemeService themeService: IThemeService
E
Erich Gamma 已提交
50
	) {
B
Benjamin Pasero 已提交
51
		super(VIEWLET_ID, telemetryService, themeService);
E
Erich Gamma 已提交
52 53

		this.progressRunner = null;
I
isidor 已提交
54
		this.viewletSettings = this.getMemento(storageService, Scope.WORKSPACE);
E
Erich Gamma 已提交
55
		this.toDispose = [];
56
		this.views = [];
57 58
		this.toDispose.push(this.debugService.onDidChangeState(state => {
			this.onDebugServiceStateChange(state);
E
Erich Gamma 已提交
59
		}));
I
isidor 已提交
60
		lifecycleService.onShutdown(this.store, this);
E
Erich Gamma 已提交
61 62
	}

I
isidor 已提交
63
	// viewlet
E
Erich Gamma 已提交
64

I
isidor 已提交
65
	public create(parent: Builder): TPromise<void> {
E
Erich Gamma 已提交
66 67 68
		super.create(parent);
		this.$el = parent.div().addClass('debug-viewlet');

69
		const actionRunner = this.getActionRunner();
I
isidor 已提交
70 71 72
		const registeredViews = DebugViewRegistry.getDebugViews();
		this.views = registeredViews.map(viewConstructor => this.instantiationService.createInstance(
			viewConstructor.view,
73 74 75
			actionRunner,
			this.viewletSettings)
		);
76

77 78
		this.splitView = new SplitView(this.$el.getHTMLElement());
		this.toDispose.push(this.splitView);
I
isidor 已提交
79 80 81 82 83
		let weights: number[] = JSON.parse(this.storageService.get(DEBUG_VIEWS_WEIGHTS, StorageScope.WORKSPACE, '[]'));
		if (!weights.length) {
			weights = registeredViews.map(v => v.weight);
		}

I
isidor 已提交
84
		for (let i = 0; i < this.views.length; i++) {
I
isidor 已提交
85
			this.splitView.addView(this.views[i], Math.max(weights[i], 1));
I
isidor 已提交
86
		}
E
Erich Gamma 已提交
87

A
Alex Dima 已提交
88
		return TPromise.as(null);
E
Erich Gamma 已提交
89 90
	}

I
isidor 已提交
91
	public setVisible(visible: boolean): TPromise<any> {
92
		return super.setVisible(visible).then(() => {
I
isidor 已提交
93
			return TPromise.join(this.views.map(view => view.setVisible(visible)));
94 95 96
		});
	}

I
isidor 已提交
97
	public layout(dimension: Dimension): void {
E
Erich Gamma 已提交
98 99 100 101 102
		if (this.splitView) {
			this.splitView.layout(dimension.height);
		}
	}

I
isidor 已提交
103 104
	public focus(): void {
		super.focus();
105

106 107
		if (!this.contextService.getWorkspace()) {
			this.views[0].focusBody();
108 109
		}

I
isidor 已提交
110 111
		if (this.startDebugActionItem) {
			this.startDebugActionItem.focus();
I
isidor 已提交
112 113 114
		}
	}

I
isidor 已提交
115
	public getActions(): IAction[] {
E
Erich Gamma 已提交
116
		if (!this.actions) {
117 118 119 120 121 122
			this.actions = [];
			this.actions.push(this.instantiationService.createInstance(StartAction, StartAction.ID, StartAction.LABEL));
			if (this.contextService.getWorkspace()) {
				this.actions.push(this.instantiationService.createInstance(ConfigureAction, ConfigureAction.ID, ConfigureAction.LABEL));
			}
			this.actions.push(this.instantiationService.createInstance(ToggleReplAction, ToggleReplAction.ID, ToggleReplAction.LABEL));
E
Erich Gamma 已提交
123 124 125 126 127 128 129 130 131

			this.actions.forEach(a => {
				this.toDispose.push(a);
			});
		}

		return this.actions;
	}

I
isidor 已提交
132
	public getActionItem(action: IAction): IActionItem {
133
		if (action.id === StartAction.ID && this.contextService.getWorkspace()) {
I
isidor 已提交
134 135 136 137 138
			if (!this.startDebugActionItem) {
				this.startDebugActionItem = this.instantiationService.createInstance(StartDebugActionItem, null, action);
			}

			return this.startDebugActionItem;
E
Erich Gamma 已提交
139 140 141 142 143
		}

		return null;
	}

144
	private onDebugServiceStateChange(state: State): void {
E
Erich Gamma 已提交
145 146 147 148
		if (this.progressRunner) {
			this.progressRunner.done();
		}

149
		if (state === State.Initializing) {
E
Erich Gamma 已提交
150 151 152 153 154 155
			this.progressRunner = this.progressService.show(true);
		} else {
			this.progressRunner = null;
		}
	}

I
isidor 已提交
156 157 158 159
	private store(): void {
		this.storageService.store(DEBUG_VIEWS_WEIGHTS, JSON.stringify(this.views.map(view => view.size)), StorageScope.WORKSPACE);
	}

E
Erich Gamma 已提交
160
	public dispose(): void {
J
Joao Moreno 已提交
161
		this.toDispose = lifecycle.dispose(this.toDispose);
E
Erich Gamma 已提交
162 163 164 165 166 167 168 169 170

		super.dispose();
	}

	public shutdown(): void {
		this.views.forEach(v => v.shutdown());
		super.shutdown();
	}
}