-
Notifications
You must be signed in to change notification settings - Fork 29.1k
/
dirtyFilesIndicator.ts
70 lines (57 loc) · 2.98 KB
/
dirtyFilesIndicator.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import * as nls from 'vs/nls';
import { IWorkbenchContribution } from 'vs/workbench/common/contributions';
import { VIEWLET_ID } from 'vs/workbench/contrib/files/common/files';
import { ILifecycleService } from 'vs/workbench/services/lifecycle/common/lifecycle';
import { Disposable, MutableDisposable } from 'vs/base/common/lifecycle';
import { IActivityService, NumberBadge } from 'vs/workbench/services/activity/common/activity';
import { IWorkingCopyService } from 'vs/workbench/services/workingCopy/common/workingCopyService';
import { IWorkingCopy, WorkingCopyCapabilities } from 'vs/workbench/services/workingCopy/common/workingCopy';
import { IFilesConfigurationService, AutoSaveMode } from 'vs/workbench/services/filesConfiguration/common/filesConfigurationService';
export class DirtyFilesIndicator extends Disposable implements IWorkbenchContribution {
private readonly badgeHandle = this._register(new MutableDisposable());
private lastKnownDirtyCount = 0;
constructor(
@ILifecycleService private readonly lifecycleService: ILifecycleService,
@IActivityService private readonly activityService: IActivityService,
@IWorkingCopyService private readonly workingCopyService: IWorkingCopyService,
@IFilesConfigurationService private readonly filesConfigurationService: IFilesConfigurationService
) {
super();
this.updateActivityBadge();
this.registerListeners();
}
private registerListeners(): void {
// Working copy dirty indicator
this._register(this.workingCopyService.onDidChangeDirty(workingCopy => this.onWorkingCopyDidChangeDirty(workingCopy)));
// Lifecycle
this.lifecycleService.onDidShutdown(() => this.dispose());
}
private onWorkingCopyDidChangeDirty(workingCopy: IWorkingCopy): void {
const gotDirty = workingCopy.isDirty();
if (gotDirty && !(workingCopy.capabilities & WorkingCopyCapabilities.Untitled) && this.filesConfigurationService.getAutoSaveMode() === AutoSaveMode.AFTER_SHORT_DELAY) {
return; // do not indicate dirty of working copies that are auto saved after short delay
}
if (gotDirty || this.lastKnownDirtyCount > 0) {
this.updateActivityBadge();
}
}
private updateActivityBadge(): void {
const dirtyCount = this.lastKnownDirtyCount = this.workingCopyService.dirtyCount;
// Indicate dirty count in badge if any
if (dirtyCount > 0) {
this.badgeHandle.value = this.activityService.showViewContainerActivity(
VIEWLET_ID,
{
badge: new NumberBadge(dirtyCount, num => num === 1 ? nls.localize('dirtyFile', "1 unsaved file") : nls.localize('dirtyFiles', "{0} unsaved files", dirtyCount)),
clazz: 'explorer-viewlet-label'
}
);
} else {
this.badgeHandle.clear();
}
}
}