Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/services/activity/browser/activityService.ts
3296 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import { IActivityService, IActivity } from '../common/activity.js';
7
import { IDisposable, Disposable, toDisposable } from '../../../../base/common/lifecycle.js';
8
import { InstantiationType, registerSingleton } from '../../../../platform/instantiation/common/extensions.js';
9
import { IViewDescriptorService, ViewContainer } from '../../../common/views.js';
10
import { GLOBAL_ACTIVITY_ID, ACCOUNTS_ACTIVITY_ID } from '../../../common/activity.js';
11
import { Emitter, Event } from '../../../../base/common/event.js';
12
import { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';
13
14
class ViewContainerActivityByView extends Disposable {
15
16
private activity: IActivity | undefined = undefined;
17
private activityDisposable: IDisposable = Disposable.None;
18
19
constructor(
20
private readonly viewId: string,
21
@IViewDescriptorService private readonly viewDescriptorService: IViewDescriptorService,
22
@IActivityService private readonly activityService: IActivityService,
23
) {
24
super();
25
this._register(Event.filter(this.viewDescriptorService.onDidChangeContainer, e => e.views.some(view => view.id === viewId))(() => this.update()));
26
this._register(Event.filter(this.viewDescriptorService.onDidChangeLocation, e => e.views.some(view => view.id === viewId))(() => this.update()));
27
}
28
29
setActivity(activity: IActivity): void {
30
this.activity = activity;
31
this.update();
32
}
33
34
clearActivity(): void {
35
this.activity = undefined;
36
this.update();
37
}
38
39
private update(): void {
40
this.activityDisposable.dispose();
41
const container = this.viewDescriptorService.getViewContainerByViewId(this.viewId);
42
if (container && this.activity) {
43
this.activityDisposable = this.activityService.showViewContainerActivity(container.id, this.activity);
44
}
45
}
46
47
override dispose() {
48
this.activityDisposable.dispose();
49
super.dispose();
50
}
51
}
52
53
interface IViewActivity {
54
id: number;
55
readonly activity: ViewContainerActivityByView;
56
}
57
58
export class ActivityService extends Disposable implements IActivityService {
59
60
public _serviceBrand: undefined;
61
62
private readonly viewActivities = new Map<string, IViewActivity>();
63
64
private readonly _onDidChangeActivity = this._register(new Emitter<string | ViewContainer>());
65
readonly onDidChangeActivity = this._onDidChangeActivity.event;
66
67
private readonly viewContainerActivities = new Map<string, IActivity[]>();
68
private readonly globalActivities = new Map<string, IActivity[]>();
69
70
constructor(
71
@IViewDescriptorService private readonly viewDescriptorService: IViewDescriptorService,
72
@IInstantiationService private readonly instantiationService: IInstantiationService
73
) {
74
super();
75
}
76
77
showViewContainerActivity(viewContainerId: string, activity: IActivity): IDisposable {
78
const viewContainer = this.viewDescriptorService.getViewContainerById(viewContainerId);
79
if (!viewContainer) {
80
return Disposable.None;
81
}
82
83
let activities = this.viewContainerActivities.get(viewContainerId);
84
if (!activities) {
85
activities = [];
86
this.viewContainerActivities.set(viewContainerId, activities);
87
}
88
89
// add activity
90
activities.push(activity);
91
92
this._onDidChangeActivity.fire(viewContainer);
93
94
return toDisposable(() => {
95
activities.splice(activities.indexOf(activity), 1);
96
if (activities.length === 0) {
97
this.viewContainerActivities.delete(viewContainerId);
98
}
99
this._onDidChangeActivity.fire(viewContainer);
100
});
101
}
102
103
getViewContainerActivities(viewContainerId: string): IActivity[] {
104
const viewContainer = this.viewDescriptorService.getViewContainerById(viewContainerId);
105
if (viewContainer) {
106
return this.viewContainerActivities.get(viewContainerId) ?? [];
107
}
108
return [];
109
}
110
111
showViewActivity(viewId: string, activity: IActivity): IDisposable {
112
let maybeItem = this.viewActivities.get(viewId);
113
114
if (maybeItem) {
115
maybeItem.id++;
116
} else {
117
maybeItem = {
118
id: 1,
119
activity: this.instantiationService.createInstance(ViewContainerActivityByView, viewId)
120
};
121
122
this.viewActivities.set(viewId, maybeItem);
123
}
124
125
const id = maybeItem.id;
126
maybeItem.activity.setActivity(activity);
127
128
const item = maybeItem;
129
return toDisposable(() => {
130
if (item.id === id) {
131
item.activity.dispose();
132
this.viewActivities.delete(viewId);
133
}
134
});
135
}
136
137
showAccountsActivity(activity: IActivity): IDisposable {
138
return this.showActivity(ACCOUNTS_ACTIVITY_ID, activity);
139
}
140
141
showGlobalActivity(activity: IActivity): IDisposable {
142
return this.showActivity(GLOBAL_ACTIVITY_ID, activity);
143
}
144
145
getActivity(id: string): IActivity[] {
146
return this.globalActivities.get(id) ?? [];
147
}
148
149
private showActivity(id: string, activity: IActivity): IDisposable {
150
let activities = this.globalActivities.get(id);
151
if (!activities) {
152
activities = [];
153
this.globalActivities.set(id, activities);
154
}
155
activities.push(activity);
156
this._onDidChangeActivity.fire(id);
157
return toDisposable(() => {
158
activities.splice(activities.indexOf(activity), 1);
159
if (activities.length === 0) {
160
this.globalActivities.delete(id);
161
}
162
this._onDidChangeActivity.fire(id);
163
});
164
}
165
}
166
167
registerSingleton(IActivityService, ActivityService, InstantiationType.Delayed);
168
169