Skip to content

Commit 1a0311a

Browse files
committed
labelService: allow to register workspace label formater
1 parent 8f96ce6 commit 1a0311a

9 files changed

Lines changed: 67 additions & 54 deletions

File tree

src/vs/code/electron-main/app.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,7 @@ export class CodeApplication {
229229
});
230230

231231
ipc.on('vscode:labelRegisterFormater', (event: any, { scheme, formater }) => {
232-
this.labelService.registerFormater(scheme, formater);
232+
this.labelService.registerFormatter(scheme, formater);
233233
});
234234

235235
ipc.on('vscode:toggleDevTools', (event: Event) => {

src/vs/editor/standalone/browser/simpleServices.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ import { WorkspaceEdit, isResourceTextEdit, TextEdit } from 'vs/editor/common/mo
4545
import { IModelService } from 'vs/editor/common/services/modelService';
4646
import { EditOperation } from 'vs/editor/common/core/editOperation';
4747
import { localize } from 'vs/nls';
48-
import { ILabelService, UriLabelRules } from 'vs/platform/label/common/label';
48+
import { ILabelService, LabelRules } from 'vs/platform/label/common/label';
4949

5050
export class SimpleModel implements ITextEditorModel {
5151

@@ -599,8 +599,8 @@ export class SimpleBulkEditService implements IBulkEditService {
599599
export class SimpleUriLabelService implements ILabelService {
600600
_serviceBrand: any;
601601

602-
private readonly _onDidRegisterFormater: Emitter<{ scheme: string, formater: UriLabelRules }> = new Emitter<{ scheme: string, formater: UriLabelRules }>();
603-
public readonly onDidRegisterFormater: Event<{ scheme: string, formater: UriLabelRules }> = this._onDidRegisterFormater.event;
602+
private readonly _onDidRegisterFormatter: Emitter<{ scheme: string, formatter: LabelRules }> = new Emitter<{ scheme: string, formatter: LabelRules }>();
603+
public readonly onDidRegisterFormatter: Event<{ scheme: string, formatter: LabelRules }> = this._onDidRegisterFormatter.event;
604604

605605
public getUriLabel(resource: URI, relative?: boolean): string {
606606
if (resource.scheme === 'file') {
@@ -613,7 +613,7 @@ export class SimpleUriLabelService implements ILabelService {
613613
return '';
614614
}
615615

616-
public registerFormater(schema: string, formater: UriLabelRules): IDisposable {
616+
public registerFormatter(schema: string, formatter: LabelRules): IDisposable {
617617
throw new Error('Not implemented');
618618
}
619619
}

src/vs/platform/label/common/label.ts

Lines changed: 33 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,20 @@ export interface ILabelService {
2222
_serviceBrand: any;
2323
getUriLabel(resource: URI, relative?: boolean, forceNoTildify?: boolean): string;
2424
getWorkspaceLabel(workspace: (IWorkspaceIdentifier | ISingleFolderWorkspaceIdentifier | IWorkspace), options?: { verbose: boolean }): string;
25-
registerFormater(schema: string, formater: UriLabelRules): IDisposable;
26-
onDidRegisterFormater: Event<{ scheme: string, formater: UriLabelRules }>;
25+
registerFormatter(schema: string, formatter: LabelRules): IDisposable;
26+
onDidRegisterFormatter: Event<{ scheme: string, formatter: LabelRules }>;
2727
}
2828

29-
export interface UriLabelRules {
30-
label: string; // myLabel:/${path}
31-
separator: '/' | '\\' | '';
32-
tildify?: boolean;
33-
normalizeDriveLetter?: boolean;
29+
export interface LabelRules {
30+
uri: {
31+
label: string; // myLabel:/${path}
32+
separator: '/' | '\\' | '';
33+
tildify?: boolean;
34+
normalizeDriveLetter?: boolean;
35+
};
36+
workspace?: {
37+
suffix: string;
38+
};
3439
}
3540

3641
const LABEL_SERVICE_ID = 'label';
@@ -44,24 +49,24 @@ function hasDriveLetter(path: string): boolean {
4449
export class LabelService implements ILabelService {
4550
_serviceBrand: any;
4651

47-
private readonly formaters = new Map<string, UriLabelRules>();
48-
private readonly _onDidRegisterFormater = new Emitter<{ scheme: string, formater: UriLabelRules }>();
52+
private readonly formatters = new Map<string, LabelRules>();
53+
private readonly _onDidRegisterFormatter = new Emitter<{ scheme: string, formatter: LabelRules }>();
4954

5055
constructor(
5156
@IEnvironmentService private environmentService: IEnvironmentService,
5257
@IWorkspaceContextService private contextService: IWorkspaceContextService
5358
) { }
5459

55-
get onDidRegisterFormater(): Event<{ scheme: string, formater: UriLabelRules }> {
56-
return this._onDidRegisterFormater.event;
60+
get onDidRegisterFormatter(): Event<{ scheme: string, formatter: LabelRules }> {
61+
return this._onDidRegisterFormatter.event;
5762
}
5863

5964
getUriLabel(resource: URI, relative?: boolean, forceNoTildify?: boolean): string {
6065
if (!resource) {
6166
return undefined;
6267
}
63-
const formater = this.formaters.get(resource.scheme);
64-
if (!formater) {
68+
const formatter = this.formatters.get(resource.scheme);
69+
if (!formatter) {
6570
return getPathLabel(resource.path, this.environmentService, relative ? this.contextService : undefined);
6671
}
6772

@@ -72,8 +77,8 @@ export class LabelService implements ILabelService {
7277
if (isEqual(baseResource.uri, resource, !isLinux)) {
7378
relativeLabel = ''; // no label if resources are identical
7479
} else {
75-
const baseResourceLabel = this.formatUri(baseResource.uri, formater, forceNoTildify);
76-
relativeLabel = ltrim(this.formatUri(resource, formater, forceNoTildify).substring(baseResourceLabel.length), formater.separator);
80+
const baseResourceLabel = this.formatUri(baseResource.uri, formatter, forceNoTildify);
81+
relativeLabel = ltrim(this.formatUri(resource, formatter, forceNoTildify).substring(baseResourceLabel.length), formatter.uri.separator);
7782
}
7883

7984
const hasMultipleRoots = this.contextService.getWorkspace().folders.length > 1;
@@ -86,7 +91,7 @@ export class LabelService implements ILabelService {
8691
}
8792
}
8893

89-
return this.formatUri(resource, formater, forceNoTildify);
94+
return this.formatUri(resource, formatter, forceNoTildify);
9095
}
9196

9297
getWorkspaceLabel(workspace: (IWorkspaceIdentifier | ISingleFolderWorkspaceIdentifier | IWorkspace), options?: { verbose: boolean }): string {
@@ -100,7 +105,9 @@ export class LabelService implements ILabelService {
100105
// Workspace: Single Folder
101106
if (isSingleFolderWorkspaceIdentifier(workspace)) {
102107
// Folder on disk
103-
return options && options.verbose ? this.getUriLabel(workspace) : basenameOrAuthority(workspace);
108+
const formatter = this.formatters.get(workspace.scheme);
109+
const label = options && options.verbose ? this.getUriLabel(workspace) : basenameOrAuthority(workspace);
110+
return formatter && formatter.workspace && formatter.workspace.suffix ? `${label} (${formatter.workspace.suffix})` : label;
104111
}
105112

106113
// Workspace: Untitled
@@ -118,17 +125,17 @@ export class LabelService implements ILabelService {
118125
return localize('workspaceName', "{0} (Workspace)", workspaceName);
119126
}
120127

121-
registerFormater(scheme: string, formater: UriLabelRules): IDisposable {
122-
this.formaters.set(scheme, formater);
123-
this._onDidRegisterFormater.fire({ scheme, formater });
128+
registerFormatter(scheme: string, formatter: LabelRules): IDisposable {
129+
this.formatters.set(scheme, formatter);
130+
this._onDidRegisterFormatter.fire({ scheme, formatter });
124131

125132
return {
126-
dispose: () => this.formaters.delete(scheme)
133+
dispose: () => this.formatters.delete(scheme)
127134
};
128135
}
129136

130-
private formatUri(resource: URI, formater: UriLabelRules, forceNoTildify: boolean): string {
131-
let label = formater.label.replace(labelMatchingRegexp, match => {
137+
private formatUri(resource: URI, formatter: LabelRules, forceNoTildify: boolean): string {
138+
let label = formatter.uri.label.replace(labelMatchingRegexp, match => {
132139
switch (match) {
133140
case '${scheme}': return resource.scheme;
134141
case '${authority}': return resource.authority;
@@ -138,15 +145,15 @@ export class LabelService implements ILabelService {
138145
});
139146

140147
// convert \c:\something => C:\something
141-
if (formater.normalizeDriveLetter && hasDriveLetter(label)) {
148+
if (formatter.uri.normalizeDriveLetter && hasDriveLetter(label)) {
142149
label = label.charAt(1).toUpperCase() + label.substr(2);
143150
}
144151

145-
if (formater.tildify && !forceNoTildify) {
152+
if (formatter.uri.tildify && !forceNoTildify) {
146153
label = tildify(label, this.environmentService.userHome);
147154
}
148155

149-
return label.replace(sepRegexp, formater.separator);
156+
return label.replace(sepRegexp, formatter.uri.separator);
150157
}
151158
}
152159

src/vs/platform/label/electron-browser/label.contribution.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle';
1616
class LabelRegistrationContribution implements IWorkbenchContribution {
1717

1818
constructor(@ILabelService labelService: ILabelService) {
19-
labelService.onDidRegisterFormater(data => {
19+
labelService.onDidRegisterFormatter(data => {
2020
ipc.send('vscode:labelRegisterFormater', data);
2121
});
2222
}

src/vs/platform/label/test/uriLabel.test.ts renamed to src/vs/platform/label/test/label.test.ts

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,13 @@ suite('URI Label', () => {
2121
});
2222

2323
test('file scheme', function () {
24-
labelService.registerFormater(Schemas.file, {
25-
label: '${path}',
26-
separator: nativeSep,
27-
tildify: !isWindows,
28-
normalizeDriveLetter: isWindows
24+
labelService.registerFormatter(Schemas.file, {
25+
uri: {
26+
label: '${path}',
27+
separator: nativeSep,
28+
tildify: !isWindows,
29+
normalizeDriveLetter: isWindows
30+
}
2931
});
3032

3133
const uri1 = TestWorkspace.folders[0].uri.with({ path: TestWorkspace.folders[0].uri.path.concat('/a/b/c/d') });
@@ -37,11 +39,13 @@ suite('URI Label', () => {
3739
});
3840

3941
test('custom scheme', function () {
40-
labelService.registerFormater(Schemas.vscode, {
41-
label: 'LABEL/${path}/${authority}/END',
42-
separator: '/',
43-
tildify: true,
44-
normalizeDriveLetter: true
42+
labelService.registerFormatter(Schemas.vscode, {
43+
uri: {
44+
label: 'LABEL/${path}/${authority}/END',
45+
separator: '/',
46+
tildify: true,
47+
normalizeDriveLetter: true
48+
}
4549
});
4650

4751
const uri1 = URI.parse('vscode://microsoft.com/1/2/3/4/5');

src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { TPromise } from 'vs/base/common/winjs.base';
1111
import { FileWriteOptions, FileSystemProviderCapabilities, IFileChange, IFileService, IFileSystemProvider, IStat, IWatchOptions, FileType, FileOverwriteOptions, FileDeleteOptions } from 'vs/platform/files/common/files';
1212
import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers';
1313
import { ExtHostContext, ExtHostFileSystemShape, IExtHostContext, IFileChangeDto, MainContext, MainThreadFileSystemShape } from '../node/extHost.protocol';
14-
import { UriLabelRules, ILabelService } from 'vs/platform/label/common/label';
14+
import { LabelRules, ILabelService } from 'vs/platform/label/common/label';
1515

1616
@extHostNamedCustomer(MainContext.MainThreadFileSystem)
1717
export class MainThreadFileSystem implements MainThreadFileSystemShape {
@@ -41,8 +41,8 @@ export class MainThreadFileSystem implements MainThreadFileSystemShape {
4141
this._fileProvider.delete(handle);
4242
}
4343

44-
$setUriFormatter(scheme: string, formatter: UriLabelRules): void {
45-
this._labelService.registerFormater(scheme, formatter);
44+
$setUriFormatter(scheme: string, formatter: LabelRules): void {
45+
this._labelService.registerFormatter(scheme, formatter);
4646
}
4747

4848
$onFileSystemChange(handle: number, changes: IFileChangeDto[]): void {

src/vs/workbench/api/node/extHost.protocol.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ import { IExtensionDescription } from 'vs/workbench/services/extensions/common/e
4040
import { createExtHostContextProxyIdentifier as createExtId, createMainContextProxyIdentifier as createMainId, IRPCProtocol, ProxyIdentifier } from 'vs/workbench/services/extensions/node/proxyIdentifier';
4141
import { IProgressOptions, IProgressStep } from 'vs/workbench/services/progress/common/progress';
4242
import { SaveReason } from 'vs/workbench/services/textfile/common/textfiles';
43-
import { UriLabelRules } from 'vs/platform/label/common/label';
43+
import { LabelRules } from 'vs/platform/label/common/label';
4444
import * as vscode from 'vscode';
4545

4646
export interface IEnvironment {
@@ -483,7 +483,7 @@ export interface IFileChangeDto {
483483
export interface MainThreadFileSystemShape extends IDisposable {
484484
$registerFileSystemProvider(handle: number, scheme: string, capabilities: FileSystemProviderCapabilities): void;
485485
$unregisterProvider(handle: number): void;
486-
$setUriFormatter(scheme: string, formatter: UriLabelRules): void;
486+
$setUriFormatter(scheme: string, formatter: LabelRules): void;
487487
$onFileSystemChange(handle: number, resource: IFileChangeDto[]): void;
488488
}
489489

src/vs/workbench/api/node/extHostFileSystem.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import { values } from 'vs/base/common/map';
1515
import { Range, FileChangeType } from 'vs/workbench/api/node/extHostTypes';
1616
import { ExtHostLanguageFeatures } from 'vs/workbench/api/node/extHostLanguageFeatures';
1717
import { Schemas } from 'vs/base/common/network';
18-
import { UriLabelRules } from 'vs/platform/label/common/label';
18+
import { LabelRules } from 'vs/platform/label/common/label';
1919

2020
class FsLinkProvider implements vscode.DocumentLinkProvider {
2121

@@ -142,7 +142,7 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape {
142142
});
143143
}
144144

145-
setUriFormatter(scheme: string, formatter: UriLabelRules): void {
145+
setUriFormatter(scheme: string, formatter: LabelRules): void {
146146
this._proxy.$setUriFormatter(scheme, formatter);
147147
}
148148

src/vs/workbench/parts/files/electron-browser/files.contribution.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,13 @@ export class OpenExplorerViewletAction extends ToggleViewletAction {
5656
class FileUriLabelContribution implements IWorkbenchContribution {
5757

5858
constructor(@ILabelService labelService: ILabelService) {
59-
labelService.registerFormater(Schemas.file, {
60-
label: '${path}',
61-
separator: nativeSep,
62-
tildify: !platform.isWindows,
63-
normalizeDriveLetter: platform.isWindows
59+
labelService.registerFormatter(Schemas.file, {
60+
uri: {
61+
label: '${path}',
62+
separator: nativeSep,
63+
tildify: !platform.isWindows,
64+
normalizeDriveLetter: platform.isWindows
65+
}
6466
});
6567
}
6668
}

0 commit comments

Comments
 (0)