Path: blob/main/src/vs/workbench/contrib/files/common/dirtyFilesIndicator.ts
3296 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import * as nls from '../../../../nls.js';6import { IWorkbenchContribution } from '../../../common/contributions.js';7import { VIEWLET_ID } from './files.js';8import { Disposable, MutableDisposable } from '../../../../base/common/lifecycle.js';9import { IActivityService, NumberBadge } from '../../../services/activity/common/activity.js';10import { IWorkingCopyService } from '../../../services/workingCopy/common/workingCopyService.js';11import { IWorkingCopy, WorkingCopyCapabilities } from '../../../services/workingCopy/common/workingCopy.js';12import { IFilesConfigurationService } from '../../../services/filesConfiguration/common/filesConfigurationService.js';1314export class DirtyFilesIndicator extends Disposable implements IWorkbenchContribution {1516static readonly ID = 'workbench.contrib.dirtyFilesIndicator';1718private readonly badgeHandle = this._register(new MutableDisposable());1920private lastKnownDirtyCount = 0;2122constructor(23@IActivityService private readonly activityService: IActivityService,24@IWorkingCopyService private readonly workingCopyService: IWorkingCopyService,25@IFilesConfigurationService private readonly filesConfigurationService: IFilesConfigurationService26) {27super();2829this.updateActivityBadge();3031this.registerListeners();32}3334private registerListeners(): void {3536// Working copy dirty indicator37this._register(this.workingCopyService.onDidChangeDirty(workingCopy => this.onWorkingCopyDidChangeDirty(workingCopy)));38}3940private onWorkingCopyDidChangeDirty(workingCopy: IWorkingCopy): void {41const gotDirty = workingCopy.isDirty();42if (gotDirty && !(workingCopy.capabilities & WorkingCopyCapabilities.Untitled) && this.filesConfigurationService.hasShortAutoSaveDelay(workingCopy.resource)) {43return; // do not indicate dirty of working copies that are auto saved after short delay44}4546if (gotDirty || this.lastKnownDirtyCount > 0) {47this.updateActivityBadge();48}49}5051private updateActivityBadge(): void {52const dirtyCount = this.lastKnownDirtyCount = this.workingCopyService.dirtyCount;5354// Indicate dirty count in badge if any55if (dirtyCount > 0) {56this.badgeHandle.value = this.activityService.showViewContainerActivity(57VIEWLET_ID,58{59badge: new NumberBadge(dirtyCount, num => num === 1 ? nls.localize('dirtyFile', "1 unsaved file") : nls.localize('dirtyFiles', "{0} unsaved files", dirtyCount)),60}61);62} else {63this.badgeHandle.clear();64}65}66}676869