diff --git a/extensions/configuration-editing/src/settingsDocumentHelper.ts b/extensions/configuration-editing/src/settingsDocumentHelper.ts index 5a267b6093e..6c52bb5a511 100644 --- a/extensions/configuration-editing/src/settingsDocumentHelper.ts +++ b/extensions/configuration-editing/src/settingsDocumentHelper.ts @@ -111,7 +111,8 @@ export class SettingsDocument { completions.push(this.newSimpleCompletionItem(getText('activeFolderShort'), range, vscode.l10n.t("the name of the folder the file is contained in (e.g. myFileFolder)"))); completions.push(this.newSimpleCompletionItem(getText('activeFolderMedium'), range, vscode.l10n.t("the path of the folder the file is contained in, relative to the workspace folder (e.g. myFolder/myFileFolder)"))); completions.push(this.newSimpleCompletionItem(getText('activeFolderLong'), range, vscode.l10n.t("the full path of the folder the file is contained in (e.g. /Users/Development/myFolder/myFileFolder)"))); - completions.push(this.newSimpleCompletionItem(getText('rootName'), range, vscode.l10n.t("name of the workspace (e.g. myFolder or myWorkspace)"))); + completions.push(this.newSimpleCompletionItem(getText('rootName'), range, vscode.l10n.t("name of the workspace with optional remote name and workspace indicator if applicable (e.g. myFolder, myRemoteFolder [SSH] or myWorkspace (Workspace))"))); + completions.push(this.newSimpleCompletionItem(getText('rootNameShort'), range, vscode.l10n.t("shortened name of the workspace without suffixes (e.g. myFolder or myWorkspace)"))); completions.push(this.newSimpleCompletionItem(getText('rootPath'), range, vscode.l10n.t("file path of the workspace (e.g. /Users/Development/myWorkspace)"))); completions.push(this.newSimpleCompletionItem(getText('folderName'), range, vscode.l10n.t("name of the workspace folder the file is contained in (e.g. myFolder)"))); completions.push(this.newSimpleCompletionItem(getText('folderPath'), range, vscode.l10n.t("file path of the workspace folder the file is contained in (e.g. /Users/Development/myFolder)"))); diff --git a/src/vs/base/test/common/labels.test.ts b/src/vs/base/test/common/labels.test.ts index 82bb2d98a75..36eec1391d6 100644 --- a/src/vs/base/test/common/labels.test.ts +++ b/src/vs/base/test/common/labels.test.ts @@ -137,6 +137,10 @@ suite('Labels', () => { assert.strictEqual(labels.template(t, { dirty: '', activeEditorShort: '', rootName: 'monaco', appName: 'Visual Studio Code', separator: { label: ' - ' } }), 'monaco - Visual Studio Code'); assert.strictEqual(labels.template(t, { dirty: '', activeEditorShort: 'somefile.txt', rootName: 'monaco', appName: 'Visual Studio Code', separator: { label: ' - ' } }), 'somefile.txt - monaco - Visual Studio Code'); assert.strictEqual(labels.template(t, { dirty: '* ', activeEditorShort: 'somefile.txt', rootName: 'monaco', appName: 'Visual Studio Code', separator: { label: ' - ' } }), '* somefile.txt - monaco - Visual Studio Code'); + + // real world example (other) + t = '${dirty}${activeEditorShort}${separator}${rootNameShort}${separator}${appName}'; + assert.strictEqual(labels.template(t, { dirty: '', activeEditorShort: '', rootName: 'monaco (Workspace)', rootNameShort: 'monaco', appName: 'Visual Studio Code', separator: { label: ' - ' } }), 'monaco - Visual Studio Code'); }); test('mnemonicButtonLabel', () => { diff --git a/src/vs/editor/standalone/browser/standaloneServices.ts b/src/vs/editor/standalone/browser/standaloneServices.ts index e7145dbe851..b28cfcfd063 100644 --- a/src/vs/editor/standalone/browser/standaloneServices.ts +++ b/src/vs/editor/standalone/browser/standaloneServices.ts @@ -39,7 +39,7 @@ import { KeybindingResolver } from 'vs/platform/keybinding/common/keybindingReso import { IKeybindingItem, KeybindingsRegistry } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { ResolvedKeybindingItem } from 'vs/platform/keybinding/common/resolvedKeybindingItem'; import { USLayoutResolvedKeybinding } from 'vs/platform/keybinding/common/usLayoutResolvedKeybinding'; -import { ILabelService, ResourceLabelFormatter, IFormatterChangeEvent } from 'vs/platform/label/common/label'; +import { ILabelService, ResourceLabelFormatter, IFormatterChangeEvent, Verbosity } from 'vs/platform/label/common/label'; import { INotification, INotificationHandle, INotificationService, IPromptChoice, IPromptOptions, NoOpNotification, IStatusMessageOptions } from 'vs/platform/notification/common/notification'; import { IProgressRunner, IEditorProgressService, IProgressService, IProgress, IProgressCompositeOptions, IProgressDialogOptions, IProgressNotificationOptions, IProgressOptions, IProgressStep, IProgressWindowOptions } from 'vs/platform/progress/common/progress'; import { ITelemetryInfo, ITelemetryService, TelemetryLevel } from 'vs/platform/telemetry/common/telemetry'; @@ -870,7 +870,7 @@ class StandaloneUriLabelService implements ILabelService { return basename(resource); } - public getWorkspaceLabel(workspace: IWorkspaceIdentifier | ISingleFolderWorkspaceIdentifier | URI | IWorkspace, options?: { verbose: boolean }): string { + public getWorkspaceLabel(workspace: IWorkspaceIdentifier | ISingleFolderWorkspaceIdentifier | URI | IWorkspace, options?: { verbose: Verbosity }): string { return ''; } diff --git a/src/vs/platform/label/common/label.ts b/src/vs/platform/label/common/label.ts index e5b6b8a1045..60d6acb858a 100644 --- a/src/vs/platform/label/common/label.ts +++ b/src/vs/platform/label/common/label.ts @@ -23,7 +23,7 @@ export interface ILabelService { */ getUriLabel(resource: URI, options?: { relative?: boolean; noPrefix?: boolean; separator?: '/' | '\\' }): string; getUriBasenameLabel(resource: URI): string; - getWorkspaceLabel(workspace: (IWorkspaceIdentifier | ISingleFolderWorkspaceIdentifier | URI | IWorkspace), options?: { verbose: boolean }): string; + getWorkspaceLabel(workspace: (IWorkspaceIdentifier | ISingleFolderWorkspaceIdentifier | URI | IWorkspace), options?: { verbose: Verbosity }): string; getHostLabel(scheme: string, authority?: string): string; getHostTooltip(scheme: string, authority?: string): string | undefined; getSeparator(scheme: string, authority?: string): '/' | '\\'; @@ -39,6 +39,12 @@ export interface ILabelService { registerCachedFormatter(formatter: ResourceLabelFormatter): IDisposable; } +export const enum Verbosity { + SHORT, + MEDIUM, + LONG +} + export interface IFormatterChangeEvent { scheme: string; } diff --git a/src/vs/workbench/browser/actions/windowActions.ts b/src/vs/workbench/browser/actions/windowActions.ts index eaa2db307dd..03810af50ea 100644 --- a/src/vs/workbench/browser/actions/windowActions.ts +++ b/src/vs/workbench/browser/actions/windowActions.ts @@ -14,7 +14,7 @@ import { Categories } from 'vs/platform/action/common/actionCommonCategories'; import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { IQuickInputButton, IQuickInputService, IQuickPickSeparator, IKeyMods, IQuickPickItem } from 'vs/platform/quickinput/common/quickInput'; import { IWorkspaceContextService, IWorkspaceIdentifier } from 'vs/platform/workspace/common/workspace'; -import { ILabelService } from 'vs/platform/label/common/label'; +import { ILabelService, Verbosity } from 'vs/platform/label/common/label'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IModelService } from 'vs/editor/common/services/model'; import { ILanguageService } from 'vs/editor/common/languages/language'; @@ -196,7 +196,7 @@ abstract class BaseOpenRecentAction extends Action2 { resource = recent.folderUri; iconClasses = getIconClasses(modelService, languageService, resource, FileKind.FOLDER); openable = { folderUri: resource }; - fullLabel = recent.label || labelService.getWorkspaceLabel(resource, { verbose: true }); + fullLabel = recent.label || labelService.getWorkspaceLabel(resource, { verbose: Verbosity.LONG }); } // Workspace @@ -204,7 +204,7 @@ abstract class BaseOpenRecentAction extends Action2 { resource = recent.workspace.configPath; iconClasses = getIconClasses(modelService, languageService, resource, FileKind.ROOT_FOLDER); openable = { workspaceUri: resource }; - fullLabel = recent.label || labelService.getWorkspaceLabel(recent.workspace, { verbose: true }); + fullLabel = recent.label || labelService.getWorkspaceLabel(recent.workspace, { verbose: Verbosity.LONG }); isWorkspace = true; } diff --git a/src/vs/workbench/browser/parts/titlebar/menubarControl.ts b/src/vs/workbench/browser/parts/titlebar/menubarControl.ts index ed9a44bcfb2..7262d127316 100644 --- a/src/vs/workbench/browser/parts/titlebar/menubarControl.ts +++ b/src/vs/workbench/browser/parts/titlebar/menubarControl.ts @@ -19,7 +19,7 @@ import { IRecentlyOpened, isRecentFolder, IRecent, isRecentWorkspace, IWorkspace import { RunOnceScheduler } from 'vs/base/common/async'; import { MENUBAR_SELECTION_FOREGROUND, MENUBAR_SELECTION_BACKGROUND, MENUBAR_SELECTION_BORDER, TITLE_BAR_ACTIVE_FOREGROUND, TITLE_BAR_INACTIVE_FOREGROUND, ACTIVITY_BAR_FOREGROUND, ACTIVITY_BAR_INACTIVE_FOREGROUND } from 'vs/workbench/common/theme'; import { URI } from 'vs/base/common/uri'; -import { ILabelService } from 'vs/platform/label/common/label'; +import { ILabelService, Verbosity } from 'vs/platform/label/common/label'; import { IUpdateService, StateType } from 'vs/platform/update/common/update'; import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; @@ -317,12 +317,12 @@ export abstract class MenubarControl extends Disposable { if (isRecentFolder(recent)) { uri = recent.folderUri; - label = recent.label || this.labelService.getWorkspaceLabel(uri, { verbose: true }); + label = recent.label || this.labelService.getWorkspaceLabel(uri, { verbose: Verbosity.LONG }); commandId = 'openRecentFolder'; openable = { folderUri: uri }; } else if (isRecentWorkspace(recent)) { uri = recent.workspace.configPath; - label = recent.label || this.labelService.getWorkspaceLabel(recent.workspace, { verbose: true }); + label = recent.label || this.labelService.getWorkspaceLabel(recent.workspace, { verbose: Verbosity.LONG }); commandId = 'openRecentWorkspace'; openable = { workspaceUri: uri }; } else { diff --git a/src/vs/workbench/browser/parts/titlebar/windowTitle.ts b/src/vs/workbench/browser/parts/titlebar/windowTitle.ts index d6e0cd2a935..4413d3f80a7 100644 --- a/src/vs/workbench/browser/parts/titlebar/windowTitle.ts +++ b/src/vs/workbench/browser/parts/titlebar/windowTitle.ts @@ -17,7 +17,7 @@ import { URI } from 'vs/base/common/uri'; import { trim } from 'vs/base/common/strings'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { template } from 'vs/base/common/labels'; -import { ILabelService } from 'vs/platform/label/common/label'; +import { ILabelService, Verbosity as LabelVerbosity } from 'vs/platform/label/common/label'; import { Emitter } from 'vs/base/common/event'; import { RunOnceScheduler } from 'vs/base/common/async'; import { IProductService } from 'vs/platform/product/common/productService'; @@ -226,6 +226,7 @@ export class WindowTitle extends Disposable { const activeFolderMedium = editorFolderResource ? this.labelService.getUriLabel(editorFolderResource, { relative: true }) : ''; const activeFolderLong = editorFolderResource ? this.labelService.getUriLabel(editorFolderResource) : ''; const rootName = this.labelService.getWorkspaceLabel(workspace); + const rootNameShort = this.labelService.getWorkspaceLabel(workspace, { verbose: LabelVerbosity.SHORT }); const rootPath = root ? this.labelService.getUriLabel(root) : ''; const folderName = folder ? folder.name : ''; const folderPath = folder ? this.labelService.getUriLabel(folder.uri) : ''; @@ -243,6 +244,7 @@ export class WindowTitle extends Disposable { activeFolderLong, rootName, rootPath, + rootNameShort, folderName, folderPath, dirty, diff --git a/src/vs/workbench/browser/workbench.contribution.ts b/src/vs/workbench/browser/workbench.contribution.ts index 7db24af657b..91d1e371c1a 100644 --- a/src/vs/workbench/browser/workbench.contribution.ts +++ b/src/vs/workbench/browser/workbench.contribution.ts @@ -484,7 +484,8 @@ const registry = Registry.as(ConfigurationExtensions.Con localize('activeFolderLong', "`${activeFolderLong}`: the full path of the folder the file is contained in (e.g. /Users/Development/myFolder/myFileFolder)."), localize('folderName', "`${folderName}`: name of the workspace folder the file is contained in (e.g. myFolder)."), localize('folderPath', "`${folderPath}`: file path of the workspace folder the file is contained in (e.g. /Users/Development/myFolder)."), - localize('rootName', "`${rootName}`: name of the opened workspace or folder (e.g. myFolder or myWorkspace)."), + localize('rootName', "`${rootName}`: name of the workspace with optional remote name and workspace indicator if applicable (e.g. myFolder, myRemoteFolder [SSH] or myWorkspace (Workspace))."), + localize('rootNameShort', "`${rootNameShort}`: shortened name of the workspace without suffixes (e.g. myFolder, myRemoteFolder or myWorkspace)."), localize('rootPath', "`${rootPath}`: file path of the opened workspace or folder (e.g. /Users/Development/myWorkspace)."), localize('appName', "`${appName}`: e.g. VS Code."), localize('remoteName', "`${remoteName}`: e.g. SSH"), diff --git a/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.ts b/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.ts index 32eb413f176..a8d16303f75 100644 --- a/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.ts +++ b/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.ts @@ -29,7 +29,7 @@ import { ContextKeyExpr, ContextKeyExpression, IContextKeyService, RawContextKey import { IRecentFolder, IRecentlyOpened, IRecentWorkspace, isRecentFolder, isRecentWorkspace, IWorkspacesService } from 'vs/platform/workspaces/common/workspaces'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { onUnexpectedError } from 'vs/base/common/errors'; -import { ILabelService } from 'vs/platform/label/common/label'; +import { ILabelService, Verbosity } from 'vs/platform/label/common/label'; import { IWindowOpenable } from 'vs/platform/window/common/window'; import { splitName } from 'vs/base/common/labels'; import { IHostService } from 'vs/workbench/services/host/browser/host'; @@ -849,9 +849,9 @@ export class GettingStartedPage extends EditorPane { let windowOpenable: IWindowOpenable; if (isRecentFolder(recent)) { windowOpenable = { folderUri: recent.folderUri }; - fullPath = recent.label || this.labelService.getWorkspaceLabel(recent.folderUri, { verbose: true }); + fullPath = recent.label || this.labelService.getWorkspaceLabel(recent.folderUri, { verbose: Verbosity.LONG }); } else { - fullPath = recent.label || this.labelService.getWorkspaceLabel(recent.workspace, { verbose: true }); + fullPath = recent.label || this.labelService.getWorkspaceLabel(recent.workspace, { verbose: Verbosity.LONG }); windowOpenable = { workspaceUri: recent.workspace.configPath }; } diff --git a/src/vs/workbench/contrib/workspace/browser/workspace.contribution.ts b/src/vs/workbench/contrib/workspace/browser/workspace.contribution.ts index f259dceb44c..4c17e6e30e5 100644 --- a/src/vs/workbench/contrib/workspace/browser/workspace.contribution.ts +++ b/src/vs/workbench/contrib/workspace/browser/workspace.contribution.ts @@ -42,7 +42,7 @@ import { LIST_WORKSPACE_UNSUPPORTED_EXTENSIONS_COMMAND_ID } from 'vs/workbench/c import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { WORKSPACE_TRUST_SETTING_TAG } from 'vs/workbench/contrib/preferences/common/preferences'; import { IPreferencesService } from 'vs/workbench/services/preferences/common/preferences'; -import { ILabelService } from 'vs/platform/label/common/label'; +import { ILabelService, Verbosity } from 'vs/platform/label/common/label'; import { IProductService } from 'vs/platform/product/common/productService'; import { MANAGE_TRUST_COMMAND_ID, WorkspaceTrustContext } from 'vs/workbench/contrib/workspace/common/workspace'; import { isWeb } from 'vs/base/common/platform'; @@ -316,7 +316,7 @@ export class WorkspaceTrustUXHandler extends Disposable implements IWorkbenchCon localize('workspaceStartupTrustDetails', "{0} provides features that may automatically execute files in this workspace.", this.productService.nameShort) : localize('folderStartupTrustDetails', "{0} provides features that may automatically execute files in this folder.", this.productService.nameShort), localize('startupTrustRequestLearnMore', "If you don't trust the authors of these files, we recommend to continue in restricted mode as the files may be malicious. See [our docs](https://aka.ms/vscode-workspace-trust) to learn more."), - `\`${this.labelService.getWorkspaceLabel(workspaceIdentifier, { verbose: true })}\``, + `\`${this.labelService.getWorkspaceLabel(workspaceIdentifier, { verbose: Verbosity.LONG })}\``, ], checkboxText ); diff --git a/src/vs/workbench/services/configurationResolver/test/electron-browser/configurationResolverService.test.ts b/src/vs/workbench/services/configurationResolver/test/electron-browser/configurationResolverService.test.ts index a17e27f7917..486908e2e86 100644 --- a/src/vs/workbench/services/configurationResolver/test/electron-browser/configurationResolverService.test.ts +++ b/src/vs/workbench/services/configurationResolver/test/electron-browser/configurationResolverService.test.ts @@ -18,7 +18,7 @@ import { ICommandService } from 'vs/platform/commands/common/commands'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; -import { IFormatterChangeEvent, ILabelService, ResourceLabelFormatter } from 'vs/platform/label/common/label'; +import { IFormatterChangeEvent, ILabelService, ResourceLabelFormatter, Verbosity } from 'vs/platform/label/common/label'; import { IWorkspace, IWorkspaceFolder, IWorkspaceIdentifier, Workspace } from 'vs/platform/workspace/common/workspace'; import { testWorkspace } from 'vs/platform/workspace/test/common/testWorkspace'; import { BaseConfigurationResolverService } from 'vs/workbench/services/configurationResolver/browser/baseConfigurationResolverService'; @@ -679,7 +679,7 @@ class MockLabelService implements ILabelService { getUriBasenameLabel(resource: URI): string { throw new Error('Method not implemented.'); } - getWorkspaceLabel(workspace: URI | IWorkspaceIdentifier | IWorkspace, options?: { verbose: boolean }): string { + getWorkspaceLabel(workspace: URI | IWorkspaceIdentifier | IWorkspace, options?: { verbose: Verbosity }): string { throw new Error('Method not implemented.'); } getHostLabel(scheme: string, authority?: string): string { diff --git a/src/vs/workbench/services/host/browser/browserHostService.ts b/src/vs/workbench/services/host/browser/browserHostService.ts index 5b01c61cd3a..e1e29b0f6e8 100644 --- a/src/vs/workbench/services/host/browser/browserHostService.ts +++ b/src/vs/workbench/services/host/browser/browserHostService.ts @@ -13,7 +13,7 @@ import { IWindowSettings, IWindowOpenable, IOpenWindowOptions, isFolderToOpen, i import { isResourceEditorInput, pathsToEditors } from 'vs/workbench/common/editor'; import { whenEditorClosed } from 'vs/workbench/browser/editor'; import { IFileService } from 'vs/platform/files/common/files'; -import { ILabelService } from 'vs/platform/label/common/label'; +import { ILabelService, Verbosity } from 'vs/platform/label/common/label'; import { ModifierKeyEmitter, trackFocus } from 'vs/base/browser/dom'; import { Disposable } from 'vs/base/common/lifecycle'; import { IBrowserWorkbenchEnvironmentService } from 'vs/workbench/services/environment/browser/environmentService'; @@ -399,11 +399,11 @@ export class BrowserHostService extends Disposable implements IHostService { private getRecentLabel(openable: IWindowOpenable): string { if (isFolderToOpen(openable)) { - return this.labelService.getWorkspaceLabel(openable.folderUri, { verbose: true }); + return this.labelService.getWorkspaceLabel(openable.folderUri, { verbose: Verbosity.LONG }); } if (isWorkspaceToOpen(openable)) { - return this.labelService.getWorkspaceLabel(getWorkspaceIdentifier(openable.workspaceUri), { verbose: true }); + return this.labelService.getWorkspaceLabel(getWorkspaceIdentifier(openable.workspaceUri), { verbose: Verbosity.LONG }); } return this.labelService.getUriLabel(openable.fileUri); diff --git a/src/vs/workbench/services/host/electron-sandbox/nativeHostService.ts b/src/vs/workbench/services/host/electron-sandbox/nativeHostService.ts index f9181a1a376..548df18f2eb 100644 --- a/src/vs/workbench/services/host/electron-sandbox/nativeHostService.ts +++ b/src/vs/workbench/services/host/electron-sandbox/nativeHostService.ts @@ -7,7 +7,7 @@ import { Event } from 'vs/base/common/event'; import { IHostService } from 'vs/workbench/services/host/browser/host'; import { INativeHostService } from 'vs/platform/native/electron-sandbox/native'; import { InstantiationType, registerSingleton } from 'vs/platform/instantiation/common/extensions'; -import { ILabelService } from 'vs/platform/label/common/label'; +import { ILabelService, Verbosity } from 'vs/platform/label/common/label'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { IWindowOpenable, IOpenWindowOptions, isFolderToOpen, isWorkspaceToOpen, IOpenEmptyWindowOptions } from 'vs/platform/window/common/window'; import { Disposable } from 'vs/base/common/lifecycle'; @@ -91,11 +91,11 @@ class WorkbenchHostService extends Disposable implements IHostService { private getRecentLabel(openable: IWindowOpenable): string { if (isFolderToOpen(openable)) { - return this.labelService.getWorkspaceLabel(openable.folderUri, { verbose: true }); + return this.labelService.getWorkspaceLabel(openable.folderUri, { verbose: Verbosity.LONG }); } if (isWorkspaceToOpen(openable)) { - return this.labelService.getWorkspaceLabel({ id: '', configPath: openable.workspaceUri }, { verbose: true }); + return this.labelService.getWorkspaceLabel({ id: '', configPath: openable.workspaceUri }, { verbose: Verbosity.LONG }); } return this.labelService.getUriLabel(openable.fileUri); diff --git a/src/vs/workbench/services/label/common/labelService.ts b/src/vs/workbench/services/label/common/labelService.ts index 5e3e0114503..8759270a1d2 100644 --- a/src/vs/workbench/services/label/common/labelService.ts +++ b/src/vs/workbench/services/label/common/labelService.ts @@ -14,7 +14,7 @@ import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/ import { IWorkspaceContextService, IWorkspace, isWorkspace, ISingleFolderWorkspaceIdentifier, isSingleFolderWorkspaceIdentifier, isWorkspaceIdentifier, IWorkspaceIdentifier, toWorkspaceIdentifier, WORKSPACE_EXTENSION, isUntitledWorkspace, isTemporaryWorkspace } from 'vs/platform/workspace/common/workspace'; import { basenameOrAuthority, basename, joinPath, dirname } from 'vs/base/common/resources'; import { tildify, getPathLabel } from 'vs/base/common/labels'; -import { ILabelService, ResourceLabelFormatter, ResourceLabelFormatting, IFormatterChangeEvent } from 'vs/platform/label/common/label'; +import { ILabelService, ResourceLabelFormatter, ResourceLabelFormatting, IFormatterChangeEvent, Verbosity } from 'vs/platform/label/common/label'; import { ExtensionsRegistry } from 'vs/workbench/services/extensions/common/extensionsRegistry'; import { match } from 'vs/base/common/glob'; import { ILifecycleService, LifecyclePhase } from 'vs/workbench/services/lifecycle/common/lifecycle'; @@ -287,7 +287,7 @@ export class LabelService extends Disposable implements ILabelService { return pathLib.basename(label); } - getWorkspaceLabel(workspace: IWorkspace | IWorkspaceIdentifier | ISingleFolderWorkspaceIdentifier | URI, options?: { verbose: boolean }): string { + getWorkspaceLabel(workspace: IWorkspace | IWorkspaceIdentifier | ISingleFolderWorkspaceIdentifier | URI, options?: { verbose: Verbosity }): string { if (isWorkspace(workspace)) { const identifier = toWorkspaceIdentifier(workspace); if (identifier) { @@ -315,7 +315,7 @@ export class LabelService extends Disposable implements ILabelService { return ''; } - private doGetWorkspaceLabel(workspaceUri: URI, options?: { verbose: boolean }): string { + private doGetWorkspaceLabel(workspaceUri: URI, options?: { verbose: Verbosity }): string { // Workspace: Untitled if (isUntitledWorkspace(workspaceUri, this.environmentService)) { @@ -334,17 +334,42 @@ export class LabelService extends Disposable implements ILabelService { } let label: string; - if (options?.verbose) { - label = localize('workspaceNameVerbose', "{0} (Workspace)", this.getUriLabel(joinPath(dirname(workspaceUri), filename))); - } else { - label = localize('workspaceName', "{0} (Workspace)", filename); + switch (options?.verbose) { + case Verbosity.SHORT: + label = filename; // skip suffix for short label + break; + case Verbosity.LONG: + label = localize('workspaceNameVerbose', "{0} (Workspace)", this.getUriLabel(joinPath(dirname(workspaceUri), filename))); + break; + case Verbosity.MEDIUM: + default: + label = localize('workspaceName', "{0} (Workspace)", filename); + break; + } + + if (options?.verbose === Verbosity.SHORT) { + return label; // skip suffix for short label } return this.appendWorkspaceSuffix(label, workspaceUri); } - private doGetSingleFolderWorkspaceLabel(folderUri: URI, options?: { verbose: boolean }): string { - const label = options?.verbose ? this.getUriLabel(folderUri) : basename(folderUri) || posix.sep; + private doGetSingleFolderWorkspaceLabel(folderUri: URI, options?: { verbose: Verbosity }): string { + let label: string; + switch (options?.verbose) { + case Verbosity.LONG: + label = this.getUriLabel(folderUri); + break; + case Verbosity.SHORT: + case Verbosity.MEDIUM: + default: + label = basename(folderUri) || posix.sep; + break; + } + + if (options?.verbose === Verbosity.SHORT) { + return label; // skip suffix for short label + } return this.appendWorkspaceSuffix(label, folderUri); } diff --git a/src/vs/workbench/services/label/test/common/mockLabelService.ts b/src/vs/workbench/services/label/test/common/mockLabelService.ts index 0338dd144a2..9d46b1dd84b 100644 --- a/src/vs/workbench/services/label/test/common/mockLabelService.ts +++ b/src/vs/workbench/services/label/test/common/mockLabelService.ts @@ -7,7 +7,7 @@ import { Emitter, Event } from 'vs/base/common/event'; import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; import { basename, normalize } from 'vs/base/common/path'; import { URI } from 'vs/base/common/uri'; -import { IFormatterChangeEvent, ILabelService, ResourceLabelFormatter } from 'vs/platform/label/common/label'; +import { IFormatterChangeEvent, ILabelService, ResourceLabelFormatter, Verbosity } from 'vs/platform/label/common/label'; import { IWorkspace, IWorkspaceIdentifier } from 'vs/platform/workspace/common/workspace'; export class MockLabelService implements ILabelService { @@ -22,7 +22,7 @@ export class MockLabelService implements ILabelService { getUriBasenameLabel(resource: URI): string { return basename(resource.fsPath); } - getWorkspaceLabel(workspace: URI | IWorkspaceIdentifier | IWorkspace, options?: { verbose: boolean }): string { + getWorkspaceLabel(workspace: URI | IWorkspaceIdentifier | IWorkspace, options?: { verbose: Verbosity }): string { return ''; } getHostLabel(scheme: string, authority?: string): string { diff --git a/src/vs/workbench/services/workspaces/electron-sandbox/workspaceEditingService.ts b/src/vs/workbench/services/workspaces/electron-sandbox/workspaceEditingService.ts index 3d4f731f544..d754fcb0553 100644 --- a/src/vs/workbench/services/workspaces/electron-sandbox/workspaceEditingService.ts +++ b/src/vs/workbench/services/workspaces/electron-sandbox/workspaceEditingService.ts @@ -21,7 +21,7 @@ import { INativeWorkbenchEnvironmentService } from 'vs/workbench/services/enviro import { ILifecycleService, ShutdownReason } from 'vs/workbench/services/lifecycle/common/lifecycle'; import { IFileDialogService, IDialogService } from 'vs/platform/dialogs/common/dialogs'; import { InstantiationType, registerSingleton } from 'vs/platform/instantiation/common/extensions'; -import { ILabelService } from 'vs/platform/label/common/label'; +import { ILabelService, Verbosity } from 'vs/platform/label/common/label'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; import { IHostService } from 'vs/workbench/services/host/browser/host'; import { AbstractWorkspaceEditingService } from 'vs/workbench/services/workspaces/browser/abstractWorkspaceEditingService'; @@ -127,7 +127,7 @@ export class NativeWorkspaceEditingService extends AbstractWorkspaceEditingServi // Make sure to add the new workspace to the history to find it again const newWorkspaceIdentifier = await this.workspacesService.getWorkspaceIdentifier(newWorkspacePath); await this.workspacesService.addRecentlyOpened([{ - label: this.labelService.getWorkspaceLabel(newWorkspaceIdentifier, { verbose: true }), + label: this.labelService.getWorkspaceLabel(newWorkspaceIdentifier, { verbose: Verbosity.LONG }), workspace: newWorkspaceIdentifier, remoteAuthority: this.environmentService.remoteAuthority // remember whether this was a remote window }]);