forked from gitkraken/vscode-gitlens
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcodeLensController.ts
108 lines (88 loc) · 4.18 KB
/
codeLensController.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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
'use strict';
import { ConfigurationChangeEvent, Disposable, languages } from 'vscode';
import { configuration, ICodeLensConfig } from './configuration';
import { CommandContext, setCommandContext } from './constants';
import { Container } from './container';
import { DocumentBlameStateChangeEvent, DocumentDirtyIdleTriggerEvent, GitDocumentState } from './trackers/documentTracker';
import { GitCodeLensProvider } from './gitCodeLensProvider';
import { Logger } from './logger';
export class CodeLensController extends Disposable {
private _canToggle: boolean = false;
private _disposable: Disposable | undefined;
private _provider: GitCodeLensProvider | undefined;
private _providerDisposable: Disposable | undefined;
constructor() {
super(() => this.dispose());
this._disposable = Disposable.from(
configuration.onDidChange(this.onConfigurationChanged, this)
);
this.onConfigurationChanged(configuration.initializingChangeEvent);
}
dispose() {
this._providerDisposable && this._providerDisposable.dispose();
this._disposable && this._disposable.dispose();
}
private onConfigurationChanged(e: ConfigurationChangeEvent) {
const initializing = configuration.initializing(e);
const section = configuration.name('codeLens').value;
if (initializing || configuration.changed(e, section, null) ||
configuration.changed(e, configuration.name('defaultDateStyle').value) ||
configuration.changed(e, configuration.name('defaultDateFormat').value)) {
if (!initializing) {
Logger.log('CodeLens config changed; resetting CodeLens provider');
}
const cfg = configuration.get<ICodeLensConfig>(section);
if (cfg.enabled && (cfg.recentChange.enabled || cfg.authors.enabled)) {
if (this._provider !== undefined) {
this._provider.reset();
}
else {
this.createProvider();
}
}
else {
if (this._providerDisposable !== undefined) {
this._providerDisposable.dispose();
this._providerDisposable = undefined;
}
this._provider = undefined;
}
this._canToggle = cfg.recentChange.enabled || cfg.authors.enabled;
setCommandContext(CommandContext.CanToggleCodeLens, this._canToggle);
}
}
private onBlameStateChanged(e: DocumentBlameStateChangeEvent<GitDocumentState>) {
// Only reset if we have saved, since the code lens won't naturally be re-rendered
if (this._provider === undefined || !e.blameable) return;
Logger.log('Blame state changed; resetting CodeLens provider');
this._provider.reset('saved');
}
private onDirtyIdleTriggered(e: DocumentDirtyIdleTriggerEvent<GitDocumentState>) {
if (this._provider === undefined || !e.document.isBlameable) return;
const maxLines = configuration.get<number>(configuration.name('advanced')('blame')('sizeThresholdAfterEdit').value);
if (maxLines > 0 && e.document.lineCount > maxLines) return;
Logger.log('Dirty idle triggered; resetting CodeLens provider');
this._provider.reset('idle');
}
toggleCodeLens() {
if (!this._canToggle) return;
Logger.log(`toggleCodeLens()`);
if (this._provider !== undefined) {
if (this._providerDisposable !== undefined) {
this._providerDisposable.dispose();
this._providerDisposable = undefined;
}
this._provider = undefined;
return;
}
this.createProvider();
}
private createProvider() {
this._provider = new GitCodeLensProvider(Container.context, Container.git, Container.tracker);
this._providerDisposable = Disposable.from(
languages.registerCodeLensProvider(GitCodeLensProvider.selector, this._provider),
Container.tracker.onDidChangeBlameState(this.onBlameStateChanged, this),
Container.tracker.onDidTriggerDirtyIdle(this.onDirtyIdleTriggered, this)
);
}
}