提交 03241506 编写于 作者: I isidor

Merge branch 'master' into isidorn/bulkFileEditsUseTextFileService

...@@ -256,7 +256,7 @@ export class ButtonWithDropdown extends Disposable implements IButton { ...@@ -256,7 +256,7 @@ export class ButtonWithDropdown extends Disposable implements IButton {
this.button = this._register(new Button(this.element, options)); this.button = this._register(new Button(this.element, options));
this._register(this.button.onDidClick(e => this._onDidClick.fire(e))); this._register(this.button.onDidClick(e => this._onDidClick.fire(e)));
this.action = new Action('primaryAction', this.button.label, undefined, true, async () => this._onDidClick.fire(undefined)); this.action = this._register(new Action('primaryAction', this.button.label, undefined, true, async () => this._onDidClick.fire(undefined)));
this.dropdownButton = this._register(new Button(this.element, { ...options, title: false, supportIcons: true })); this.dropdownButton = this._register(new Button(this.element, { ...options, title: false, supportIcons: true }));
this.dropdownButton.element.classList.add('monaco-dropdown-button'); this.dropdownButton.element.classList.add('monaco-dropdown-button');
......
...@@ -176,7 +176,7 @@ export class ActionWithDropdownActionViewItem extends ActionViewItem { ...@@ -176,7 +176,7 @@ export class ActionWithDropdownActionViewItem extends ActionViewItem {
return [this._action, ...(Array.isArray(actionsProvider) ? actionsProvider : actionsProvider.getActions())]; return [this._action, ...(Array.isArray(actionsProvider) ? actionsProvider : actionsProvider.getActions())];
} }
}; };
this.dropdownMenuActionViewItem = new DropdownMenuActionViewItem(new Action('dropdownAction', undefined), menuActionsProvider, this.contextMenuProvider, { classNames: ['dropdown', ...Codicon.dropDownButton.classNamesArray, ...(<IActionWithDropdownActionViewItemOptions>this.options).menuActionClassNames || []] }); this.dropdownMenuActionViewItem = new DropdownMenuActionViewItem(this._register(new Action('dropdownAction', undefined)), menuActionsProvider, this.contextMenuProvider, { classNames: ['dropdown', ...Codicon.dropDownButton.classNamesArray, ...(<IActionWithDropdownActionViewItemOptions>this.options).menuActionClassNames || []] });
this.dropdownMenuActionViewItem.render(this.element); this.dropdownMenuActionViewItem.render(this.element);
} }
} }
......
...@@ -283,3 +283,16 @@ export class EmptySubmenuAction extends Action { ...@@ -283,3 +283,16 @@ export class EmptySubmenuAction extends Action {
super(EmptySubmenuAction.ID, nls.localize('submenu.empty', '(empty)'), undefined, false); super(EmptySubmenuAction.ID, nls.localize('submenu.empty', '(empty)'), undefined, false);
} }
} }
export function toAction(props: { id: string, label: string, enabled?: boolean, checked?: boolean, run: Function; }): IAction {
return {
id: props.id,
label: props.label,
class: undefined,
enabled: props.enabled ?? true,
checked: props.checked ?? false,
run: async () => props.run(),
tooltip: props.label,
dispose: () => { }
};
}
...@@ -3,12 +3,13 @@ ...@@ -3,12 +3,13 @@
* Licensed under the MIT License. See License.txt in the project root for license information. * Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/ *--------------------------------------------------------------------------------------------*/
import { localize } from 'vs/nls';
import { mark } from 'vs/base/common/performance';
import { Disposable, IDisposable, toDisposable, dispose, DisposableStore } from 'vs/base/common/lifecycle'; import { Disposable, IDisposable, toDisposable, dispose, DisposableStore } from 'vs/base/common/lifecycle';
import { IFileService, IResolveFileOptions, FileChangesEvent, FileOperationEvent, IFileSystemProviderRegistrationEvent, IFileSystemProvider, IFileStat, IResolveFileResult, ICreateFileOptions, IFileSystemProviderActivationEvent, FileOperationError, FileOperationResult, FileOperation, FileSystemProviderCapabilities, FileType, toFileSystemProviderErrorCode, FileSystemProviderErrorCode, IStat, IFileStatWithMetadata, IResolveMetadataFileOptions, etag, hasReadWriteCapability, hasFileFolderCopyCapability, hasOpenReadWriteCloseCapability, toFileOperationResult, IFileSystemProviderWithOpenReadWriteCloseCapability, IFileSystemProviderWithFileReadWriteCapability, IResolveFileResultWithMetadata, IWatchOptions, IWriteFileOptions, IReadFileOptions, IFileStreamContent, IFileContent, ETAG_DISABLED, hasFileReadStreamCapability, IFileSystemProviderWithFileReadStreamCapability, ensureFileSystemProviderError, IFileSystemProviderCapabilitiesChangeEvent } from 'vs/platform/files/common/files'; import { IFileService, IResolveFileOptions, FileChangesEvent, FileOperationEvent, IFileSystemProviderRegistrationEvent, IFileSystemProvider, IFileStat, IResolveFileResult, ICreateFileOptions, IFileSystemProviderActivationEvent, FileOperationError, FileOperationResult, FileOperation, FileSystemProviderCapabilities, FileType, toFileSystemProviderErrorCode, FileSystemProviderErrorCode, IStat, IFileStatWithMetadata, IResolveMetadataFileOptions, etag, hasReadWriteCapability, hasFileFolderCopyCapability, hasOpenReadWriteCloseCapability, toFileOperationResult, IFileSystemProviderWithOpenReadWriteCloseCapability, IFileSystemProviderWithFileReadWriteCapability, IResolveFileResultWithMetadata, IWatchOptions, IWriteFileOptions, IReadFileOptions, IFileStreamContent, IFileContent, ETAG_DISABLED, hasFileReadStreamCapability, IFileSystemProviderWithFileReadStreamCapability, ensureFileSystemProviderError, IFileSystemProviderCapabilitiesChangeEvent } from 'vs/platform/files/common/files';
import { URI } from 'vs/base/common/uri'; import { URI } from 'vs/base/common/uri';
import { Event, Emitter } from 'vs/base/common/event'; import { Event, Emitter } from 'vs/base/common/event';
import { isAbsolutePath, dirname, basename, joinPath, IExtUri, extUri, extUriIgnorePathCase } from 'vs/base/common/resources'; import { IExtUri, extUri, extUriIgnorePathCase, isAbsolutePath } from 'vs/base/common/resources';
import { localize } from 'vs/nls';
import { TernarySearchTree } from 'vs/base/common/map'; import { TernarySearchTree } from 'vs/base/common/map';
import { isNonEmptyArray, coalesce } from 'vs/base/common/arrays'; import { isNonEmptyArray, coalesce } from 'vs/base/common/arrays';
import { ILogService } from 'vs/platform/log/common/log'; import { ILogService } from 'vs/platform/log/common/log';
...@@ -19,7 +20,6 @@ import { CancellationTokenSource, CancellationToken } from 'vs/base/common/cance ...@@ -19,7 +20,6 @@ import { CancellationTokenSource, CancellationToken } from 'vs/base/common/cance
import { Schemas } from 'vs/base/common/network'; import { Schemas } from 'vs/base/common/network';
import { readFileIntoStream } from 'vs/platform/files/common/io'; import { readFileIntoStream } from 'vs/platform/files/common/io';
import { Iterable } from 'vs/base/common/iterator'; import { Iterable } from 'vs/base/common/iterator';
import * as perf from 'vs/base/common/performance';
export class FileService extends Disposable implements IFileService { export class FileService extends Disposable implements IFileService {
...@@ -49,7 +49,7 @@ export class FileService extends Disposable implements IFileService { ...@@ -49,7 +49,7 @@ export class FileService extends Disposable implements IFileService {
throw new Error(`A filesystem provider for the scheme '${scheme}' is already registered.`); throw new Error(`A filesystem provider for the scheme '${scheme}' is already registered.`);
} }
perf.mark(`code/registerFilesystem/${scheme}`); mark(`code/registerFilesystem/${scheme}`);
// Add provider with event // Add provider with event
this.provider.set(scheme, provider); this.provider.set(scheme, provider);
...@@ -104,7 +104,7 @@ export class FileService extends Disposable implements IFileService { ...@@ -104,7 +104,7 @@ export class FileService extends Disposable implements IFileService {
return !!(provider && (provider.capabilities & capability)); return !!(provider && (provider.capabilities & capability));
} }
listCapabilities(): Iterable<{ scheme: string, capabilities: FileSystemProviderCapabilities }> { listCapabilities(): Iterable<{ scheme: string, capabilities: FileSystemProviderCapabilities; }> {
return Iterable.map(this.provider, ([scheme, provider]) => ({ scheme, capabilities: provider.capabilities })); return Iterable.map(this.provider, ([scheme, provider]) => ({ scheme, capabilities: provider.capabilities }));
} }
...@@ -217,14 +217,15 @@ export class FileService extends Disposable implements IFileService { ...@@ -217,14 +217,15 @@ export class FileService extends Disposable implements IFileService {
}); });
} }
private async toFileStat(provider: IFileSystemProvider, resource: URI, stat: IStat | { type: FileType } & Partial<IStat>, siblings: number | undefined, resolveMetadata: boolean, recurse: (stat: IFileStat, siblings?: number) => boolean): Promise<IFileStat>; private async toFileStat(provider: IFileSystemProvider, resource: URI, stat: IStat | { type: FileType; } & Partial<IStat>, siblings: number | undefined, resolveMetadata: boolean, recurse: (stat: IFileStat, siblings?: number) => boolean): Promise<IFileStat>;
private async toFileStat(provider: IFileSystemProvider, resource: URI, stat: IStat, siblings: number | undefined, resolveMetadata: true, recurse: (stat: IFileStat, siblings?: number) => boolean): Promise<IFileStatWithMetadata>; private async toFileStat(provider: IFileSystemProvider, resource: URI, stat: IStat, siblings: number | undefined, resolveMetadata: true, recurse: (stat: IFileStat, siblings?: number) => boolean): Promise<IFileStatWithMetadata>;
private async toFileStat(provider: IFileSystemProvider, resource: URI, stat: IStat | { type: FileType } & Partial<IStat>, siblings: number | undefined, resolveMetadata: boolean, recurse: (stat: IFileStat, siblings?: number) => boolean): Promise<IFileStat> { private async toFileStat(provider: IFileSystemProvider, resource: URI, stat: IStat | { type: FileType; } & Partial<IStat>, siblings: number | undefined, resolveMetadata: boolean, recurse: (stat: IFileStat, siblings?: number) => boolean): Promise<IFileStat> {
const { providerExtUri } = this.getExtUri(provider);
// convert to file stat // convert to file stat
const fileStat: IFileStat = { const fileStat: IFileStat = {
resource, resource,
name: basename(resource), name: providerExtUri.basename(resource),
isFile: (stat.type & FileType.File) !== 0, isFile: (stat.type & FileType.File) !== 0,
isDirectory: (stat.type & FileType.Directory) !== 0, isDirectory: (stat.type & FileType.Directory) !== 0,
isSymbolicLink: (stat.type & FileType.SymbolicLink) !== 0, isSymbolicLink: (stat.type & FileType.SymbolicLink) !== 0,
...@@ -240,7 +241,7 @@ export class FileService extends Disposable implements IFileService { ...@@ -240,7 +241,7 @@ export class FileService extends Disposable implements IFileService {
const entries = await provider.readdir(resource); const entries = await provider.readdir(resource);
const resolvedEntries = await Promise.all(entries.map(async ([name, type]) => { const resolvedEntries = await Promise.all(entries.map(async ([name, type]) => {
try { try {
const childResource = joinPath(resource, name); const childResource = providerExtUri.joinPath(resource, name);
const childStat = resolveMetadata ? await provider.stat(childResource) : { type }; const childStat = resolveMetadata ? await provider.stat(childResource) : { type };
return await this.toFileStat(provider, childResource, childStat, entries.length, resolveMetadata, recurse); return await this.toFileStat(provider, childResource, childStat, entries.length, resolveMetadata, recurse);
...@@ -265,8 +266,8 @@ export class FileService extends Disposable implements IFileService { ...@@ -265,8 +266,8 @@ export class FileService extends Disposable implements IFileService {
return fileStat; return fileStat;
} }
async resolveAll(toResolve: { resource: URI, options?: IResolveFileOptions }[]): Promise<IResolveFileResult[]>; async resolveAll(toResolve: { resource: URI, options?: IResolveFileOptions; }[]): Promise<IResolveFileResult[]>;
async resolveAll(toResolve: { resource: URI, options: IResolveMetadataFileOptions }[]): Promise<IResolveFileResultWithMetadata[]>; async resolveAll(toResolve: { resource: URI, options: IResolveMetadataFileOptions; }[]): Promise<IResolveFileResultWithMetadata[]>;
async resolveAll(toResolve: { resource: URI; options?: IResolveFileOptions; }[]): Promise<IResolveFileResult[]> { async resolveAll(toResolve: { resource: URI; options?: IResolveFileOptions; }[]): Promise<IResolveFileResult[]> {
return Promise.all(toResolve.map(async entry => { return Promise.all(toResolve.map(async entry => {
try { try {
...@@ -329,6 +330,7 @@ export class FileService extends Disposable implements IFileService { ...@@ -329,6 +330,7 @@ export class FileService extends Disposable implements IFileService {
async writeFile(resource: URI, bufferOrReadableOrStream: VSBuffer | VSBufferReadable | VSBufferReadableStream, options?: IWriteFileOptions): Promise<IFileStatWithMetadata> { async writeFile(resource: URI, bufferOrReadableOrStream: VSBuffer | VSBufferReadable | VSBufferReadableStream, options?: IWriteFileOptions): Promise<IFileStatWithMetadata> {
const provider = this.throwIfFileSystemIsReadonly(await this.withWriteProvider(resource), resource); const provider = this.throwIfFileSystemIsReadonly(await this.withWriteProvider(resource), resource);
const { providerExtUri } = this.getExtUri(provider);
try { try {
...@@ -337,7 +339,7 @@ export class FileService extends Disposable implements IFileService { ...@@ -337,7 +339,7 @@ export class FileService extends Disposable implements IFileService {
// mkdir recursively as needed // mkdir recursively as needed
if (!stat) { if (!stat) {
await this.mkdirp(provider, dirname(resource)); await this.mkdirp(provider, providerExtUri.dirname(resource));
} }
// optimization: if the provider has unbuffered write capability and the data // optimization: if the provider has unbuffered write capability and the data
...@@ -437,7 +439,7 @@ export class FileService extends Disposable implements IFileService { ...@@ -437,7 +439,7 @@ export class FileService extends Disposable implements IFileService {
return this.doReadAsFileStream(provider, resource, options); return this.doReadAsFileStream(provider, resource, options);
} }
private async doReadAsFileStream(provider: IFileSystemProviderWithFileReadWriteCapability | IFileSystemProviderWithOpenReadWriteCloseCapability | IFileSystemProviderWithFileReadStreamCapability, resource: URI, options?: IReadFileOptions & { preferUnbuffered?: boolean }): Promise<IFileStreamContent> { private async doReadAsFileStream(provider: IFileSystemProviderWithFileReadWriteCapability | IFileSystemProviderWithOpenReadWriteCloseCapability | IFileSystemProviderWithFileReadStreamCapability, resource: URI, options?: IReadFileOptions & { preferUnbuffered?: boolean; }): Promise<IFileStreamContent> {
// install a cancellation token that gets cancelled // install a cancellation token that gets cancelled
// when any error occurs. this allows us to resolve // when any error occurs. this allows us to resolve
...@@ -636,7 +638,7 @@ export class FileService extends Disposable implements IFileService { ...@@ -636,7 +638,7 @@ export class FileService extends Disposable implements IFileService {
} }
// create parent folders // create parent folders
await this.mkdirp(targetProvider, dirname(target)); await this.mkdirp(targetProvider, this.getExtUri(targetProvider).providerExtUri.dirname(target));
// copy source => target // copy source => target
if (mode === 'copy') { if (mode === 'copy') {
...@@ -712,7 +714,7 @@ export class FileService extends Disposable implements IFileService { ...@@ -712,7 +714,7 @@ export class FileService extends Disposable implements IFileService {
// create children in target // create children in target
if (Array.isArray(sourceFolder.children)) { if (Array.isArray(sourceFolder.children)) {
await Promise.all(sourceFolder.children.map(async sourceChild => { await Promise.all(sourceFolder.children.map(async sourceChild => {
const targetChild = joinPath(targetFolder, sourceChild.name); const targetChild = this.getExtUri(targetProvider).providerExtUri.joinPath(targetFolder, sourceChild.name);
if (sourceChild.isDirectory) { if (sourceChild.isDirectory) {
return this.doCopyFolder(sourceProvider, await this.resolve(sourceChild.resource), targetProvider, targetChild); return this.doCopyFolder(sourceProvider, await this.resolve(sourceChild.resource), targetProvider, targetChild);
} else { } else {
...@@ -722,7 +724,7 @@ export class FileService extends Disposable implements IFileService { ...@@ -722,7 +724,7 @@ export class FileService extends Disposable implements IFileService {
} }
} }
private async doValidateMoveCopy(sourceProvider: IFileSystemProvider, source: URI, targetProvider: IFileSystemProvider, target: URI, mode: 'move' | 'copy', overwrite?: boolean): Promise<{ exists: boolean, isSameResourceWithDifferentPathCase: boolean }> { private async doValidateMoveCopy(sourceProvider: IFileSystemProvider, source: URI, targetProvider: IFileSystemProvider, target: URI, mode: 'move' | 'copy', overwrite?: boolean): Promise<{ exists: boolean, isSameResourceWithDifferentPathCase: boolean; }> {
let isSameResourceWithDifferentPathCase = false; let isSameResourceWithDifferentPathCase = false;
// Check if source is equal or parent to target (requires providers to be the same) // Check if source is equal or parent to target (requires providers to be the same)
...@@ -763,7 +765,7 @@ export class FileService extends Disposable implements IFileService { ...@@ -763,7 +765,7 @@ export class FileService extends Disposable implements IFileService {
return { exists, isSameResourceWithDifferentPathCase }; return { exists, isSameResourceWithDifferentPathCase };
} }
private getExtUri(provider: IFileSystemProvider): { providerExtUri: IExtUri, isPathCaseSensitive: boolean } { private getExtUri(provider: IFileSystemProvider): { providerExtUri: IExtUri, isPathCaseSensitive: boolean; } {
const isPathCaseSensitive = this.isPathCaseSensitive(provider); const isPathCaseSensitive = this.isPathCaseSensitive(provider);
return { return {
...@@ -794,7 +796,7 @@ export class FileService extends Disposable implements IFileService { ...@@ -794,7 +796,7 @@ export class FileService extends Disposable implements IFileService {
// mkdir until we reach root // mkdir until we reach root
const { providerExtUri } = this.getExtUri(provider); const { providerExtUri } = this.getExtUri(provider);
while (!providerExtUri.isEqual(directory, dirname(directory))) { while (!providerExtUri.isEqual(directory, providerExtUri.dirname(directory))) {
try { try {
const stat = await provider.stat(directory); const stat = await provider.stat(directory);
if ((stat.type & FileType.Directory) === 0) { if ((stat.type & FileType.Directory) === 0) {
...@@ -810,16 +812,16 @@ export class FileService extends Disposable implements IFileService { ...@@ -810,16 +812,16 @@ export class FileService extends Disposable implements IFileService {
} }
// Upon error, remember directories that need to be created // Upon error, remember directories that need to be created
directoriesToCreate.push(basename(directory)); directoriesToCreate.push(providerExtUri.basename(directory));
// Continue up // Continue up
directory = dirname(directory); directory = providerExtUri.dirname(directory);
} }
} }
// Create directories as needed // Create directories as needed
for (let i = directoriesToCreate.length - 1; i >= 0; i--) { for (let i = directoriesToCreate.length - 1; i >= 0; i--) {
directory = joinPath(directory, directoriesToCreate[i]); directory = providerExtUri.joinPath(directory, directoriesToCreate[i]);
try { try {
await provider.mkdir(directory); await provider.mkdir(directory);
...@@ -896,7 +898,7 @@ export class FileService extends Disposable implements IFileService { ...@@ -896,7 +898,7 @@ export class FileService extends Disposable implements IFileService {
private readonly _onDidFilesChange = this._register(new Emitter<FileChangesEvent>()); private readonly _onDidFilesChange = this._register(new Emitter<FileChangesEvent>());
readonly onDidFilesChange = this._onDidFilesChange.event; readonly onDidFilesChange = this._onDidFilesChange.event;
private readonly activeWatchers = new Map<string, { disposable: IDisposable, count: number }>(); private readonly activeWatchers = new Map<string, { disposable: IDisposable, count: number; }>();
watch(resource: URI, options: IWatchOptions = { recursive: false, excludes: [] }): IDisposable { watch(resource: URI, options: IWatchOptions = { recursive: false, excludes: [] }): IDisposable {
let watchDisposed = false; let watchDisposed = false;
......
...@@ -4,11 +4,11 @@ ...@@ -4,11 +4,11 @@
*--------------------------------------------------------------------------------------------*/ *--------------------------------------------------------------------------------------------*/
import 'vs/css!./media/activityaction'; import 'vs/css!./media/activityaction';
import * as nls from 'vs/nls'; import { localize } from 'vs/nls';
import * as DOM from 'vs/base/browser/dom'; import { EventType, addDisposableListener, EventHelper } from 'vs/base/browser/dom';
import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent';
import { EventType as TouchEventType, GestureEvent } from 'vs/base/browser/touch'; import { EventType as TouchEventType, GestureEvent } from 'vs/base/browser/touch';
import { Action, IAction, Separator, SubmenuAction } from 'vs/base/common/actions'; import { Action, IAction, Separator, SubmenuAction, toAction } from 'vs/base/common/actions';
import { KeyCode } from 'vs/base/common/keyCodes'; import { KeyCode } from 'vs/base/common/keyCodes';
import { DisposableStore } from 'vs/base/common/lifecycle'; import { DisposableStore } from 'vs/base/common/lifecycle';
import { IMenuService, MenuId, IMenu, registerAction2, Action2, IAction2Options } from 'vs/platform/actions/common/actions'; import { IMenuService, MenuId, IMenu, registerAction2, Action2, IAction2Options } from 'vs/platform/actions/common/actions';
...@@ -34,6 +34,7 @@ import { IProductService } from 'vs/platform/product/common/productService'; ...@@ -34,6 +34,7 @@ import { IProductService } from 'vs/platform/product/common/productService';
import { AnchorAlignment, AnchorAxisAlignment } from 'vs/base/browser/ui/contextview/contextview'; import { AnchorAlignment, AnchorAxisAlignment } from 'vs/base/browser/ui/contextview/contextview';
import { getTitleBarStyle } from 'vs/platform/windows/common/windows'; import { getTitleBarStyle } from 'vs/platform/windows/common/windows';
import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation';
import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage';
export class ViewContainerActivityAction extends ActivityAction { export class ViewContainerActivityAction extends ActivityAction {
...@@ -126,21 +127,21 @@ class MenuActivityActionViewItem extends ActivityActionViewItem { ...@@ -126,21 +127,21 @@ class MenuActivityActionViewItem extends ActivityActionViewItem {
// Context menus are triggered on mouse down so that an item can be picked // Context menus are triggered on mouse down so that an item can be picked
// and executed with releasing the mouse over it // and executed with releasing the mouse over it
this._register(DOM.addDisposableListener(this.container, DOM.EventType.MOUSE_DOWN, (e: MouseEvent) => { this._register(addDisposableListener(this.container, EventType.MOUSE_DOWN, (e: MouseEvent) => {
DOM.EventHelper.stop(e, true); EventHelper.stop(e, true);
this.showContextMenu(e); this.showContextMenu(e);
})); }));
this._register(DOM.addDisposableListener(this.container, DOM.EventType.KEY_UP, (e: KeyboardEvent) => { this._register(addDisposableListener(this.container, EventType.KEY_UP, (e: KeyboardEvent) => {
let event = new StandardKeyboardEvent(e); let event = new StandardKeyboardEvent(e);
if (event.equals(KeyCode.Enter) || event.equals(KeyCode.Space)) { if (event.equals(KeyCode.Enter) || event.equals(KeyCode.Space)) {
DOM.EventHelper.stop(e, true); EventHelper.stop(e, true);
this.showContextMenu(); this.showContextMenu();
} }
})); }));
this._register(DOM.addDisposableListener(this.container, TouchEventType.Tap, (e: GestureEvent) => { this._register(addDisposableListener(this.container, TouchEventType.Tap, (e: GestureEvent) => {
DOM.EventHelper.stop(e, true); EventHelper.stop(e, true);
this.showContextMenu(); this.showContextMenu();
})); }));
} }
...@@ -153,7 +154,7 @@ class MenuActivityActionViewItem extends ActivityActionViewItem { ...@@ -153,7 +154,7 @@ class MenuActivityActionViewItem extends ActivityActionViewItem {
const menu = disposables.add(this.menuService.createMenu(this.menuId, this.contextKeyService)); const menu = disposables.add(this.menuService.createMenu(this.menuId, this.contextKeyService));
actions = await this.resolveMainMenuActions(menu, disposables); actions = await this.resolveMainMenuActions(menu, disposables);
} else { } else {
actions = await this.resolveContextMenuActions(); actions = await this.resolveContextMenuActions(disposables);
} }
const isUsingCustomMenu = isWeb || (getTitleBarStyle(this.configurationService) !== 'native' && !isMacintosh); // see #40262 const isUsingCustomMenu = isWeb || (getTitleBarStyle(this.configurationService) !== 'native' && !isMacintosh); // see #40262
...@@ -176,7 +177,7 @@ class MenuActivityActionViewItem extends ActivityActionViewItem { ...@@ -176,7 +177,7 @@ class MenuActivityActionViewItem extends ActivityActionViewItem {
return actions; return actions;
} }
private async resolveContextMenuActions(): Promise<IAction[]> { protected async resolveContextMenuActions(disposables: DisposableStore): Promise<IAction[]> {
return this.contextMenuActionsProvider(); return this.contextMenuActionsProvider();
} }
} }
...@@ -195,7 +196,8 @@ export class HomeActivityActionViewItem extends MenuActivityActionViewItem { ...@@ -195,7 +196,8 @@ export class HomeActivityActionViewItem extends MenuActivityActionViewItem {
@IContextMenuService contextMenuService: IContextMenuService, @IContextMenuService contextMenuService: IContextMenuService,
@IContextKeyService contextKeyService: IContextKeyService, @IContextKeyService contextKeyService: IContextKeyService,
@IConfigurationService configurationService: IConfigurationService, @IConfigurationService configurationService: IConfigurationService,
@IWorkbenchEnvironmentService environmentService: IWorkbenchEnvironmentService @IWorkbenchEnvironmentService environmentService: IWorkbenchEnvironmentService,
@IStorageService private readonly storageService: IStorageService
) { ) {
super(MenuId.MenubarHomeMenu, action, contextMenuActionsProvider, colors, themeService, menuService, contextMenuService, contextKeyService, configurationService, environmentService); super(MenuId.MenubarHomeMenu, action, contextMenuActionsProvider, colors, themeService, menuService, contextMenuService, contextKeyService, configurationService, environmentService);
} }
...@@ -204,7 +206,7 @@ export class HomeActivityActionViewItem extends MenuActivityActionViewItem { ...@@ -204,7 +206,7 @@ export class HomeActivityActionViewItem extends MenuActivityActionViewItem {
const actions = []; const actions = [];
// Go Home // Go Home
actions.push(disposables.add(new Action('goHome', nls.localize('goHome', "Go Home"), undefined, true, async () => window.location.href = this.goHomeHref))); actions.push(toAction({ id: 'goHome', label: localize('goHome', "Go Home"), run: () => window.location.href = this.goHomeHref }));
// Contributed // Contributed
const contributedActions = await super.resolveMainMenuActions(homeMenu, disposables); const contributedActions = await super.resolveMainMenuActions(homeMenu, disposables);
...@@ -215,6 +217,17 @@ export class HomeActivityActionViewItem extends MenuActivityActionViewItem { ...@@ -215,6 +217,17 @@ export class HomeActivityActionViewItem extends MenuActivityActionViewItem {
return actions; return actions;
} }
protected async resolveContextMenuActions(disposables: DisposableStore): Promise<IAction[]> {
const actions = await super.resolveContextMenuActions(disposables);
actions.unshift(...[
toAction({ id: 'hideHomeButton', label: localize('hideHomeButton', "Hide Home Button"), run: () => this.storageService.store(HomeActivityActionViewItem.HOME_BAR_VISIBILITY_PREFERENCE, false, StorageScope.GLOBAL, StorageTarget.USER) }),
new Separator()
]);
return actions;
}
} }
export class AccountsActivityActionViewItem extends MenuActivityActionViewItem { export class AccountsActivityActionViewItem extends MenuActivityActionViewItem {
...@@ -233,6 +246,7 @@ export class AccountsActivityActionViewItem extends MenuActivityActionViewItem { ...@@ -233,6 +246,7 @@ export class AccountsActivityActionViewItem extends MenuActivityActionViewItem {
@IWorkbenchEnvironmentService environmentService: IWorkbenchEnvironmentService, @IWorkbenchEnvironmentService environmentService: IWorkbenchEnvironmentService,
@IProductService private readonly productService: IProductService, @IProductService private readonly productService: IProductService,
@IConfigurationService configurationService: IConfigurationService, @IConfigurationService configurationService: IConfigurationService,
@IStorageService private readonly storageService: IStorageService
) { ) {
super(MenuId.AccountsContext, action, contextMenuActionsProvider, colors, themeService, menuService, contextMenuService, contextKeyService, configurationService, environmentService); super(MenuId.AccountsContext, action, contextMenuActionsProvider, colors, themeService, menuService, contextMenuService, contextKeyService, configurationService, environmentService);
} }
...@@ -269,11 +283,11 @@ export class AccountsActivityActionViewItem extends MenuActivityActionViewItem { ...@@ -269,11 +283,11 @@ export class AccountsActivityActionViewItem extends MenuActivityActionViewItem {
if (sessionInfo.sessions) { if (sessionInfo.sessions) {
Object.keys(sessionInfo.sessions).forEach(accountName => { Object.keys(sessionInfo.sessions).forEach(accountName => {
const manageExtensionsAction = disposables.add(new Action(`configureSessions${accountName}`, nls.localize('manageTrustedExtensions', "Manage Trusted Extensions"), '', true, () => { const manageExtensionsAction = disposables.add(new Action(`configureSessions${accountName}`, localize('manageTrustedExtensions', "Manage Trusted Extensions"), '', true, () => {
return this.authenticationService.manageTrustedExtensionsForAccount(sessionInfo.providerId, accountName); return this.authenticationService.manageTrustedExtensionsForAccount(sessionInfo.providerId, accountName);
})); }));
const signOutAction = disposables.add(new Action('signOut', nls.localize('signOut', "Sign Out"), '', true, () => { const signOutAction = disposables.add(new Action('signOut', localize('signOut', "Sign Out"), '', true, () => {
return this.authenticationService.signOutOfAccount(sessionInfo.providerId, accountName); return this.authenticationService.signOutOfAccount(sessionInfo.providerId, accountName);
})); }));
...@@ -288,7 +302,7 @@ export class AccountsActivityActionViewItem extends MenuActivityActionViewItem { ...@@ -288,7 +302,7 @@ export class AccountsActivityActionViewItem extends MenuActivityActionViewItem {
menus.push(providerSubMenu); menus.push(providerSubMenu);
}); });
} else { } else {
const providerUnavailableAction = disposables.add(new Action('providerUnavailable', nls.localize('authProviderUnavailable', '{0} is currently unavailable', providerDisplayName))); const providerUnavailableAction = disposables.add(new Action('providerUnavailable', localize('authProviderUnavailable', '{0} is currently unavailable', providerDisplayName)));
menus.push(providerUnavailableAction); menus.push(providerUnavailableAction);
} }
}); });
...@@ -307,6 +321,17 @@ export class AccountsActivityActionViewItem extends MenuActivityActionViewItem { ...@@ -307,6 +321,17 @@ export class AccountsActivityActionViewItem extends MenuActivityActionViewItem {
return menus; return menus;
} }
protected async resolveContextMenuActions(disposables: DisposableStore): Promise<IAction[]> {
const actions = await super.resolveContextMenuActions(disposables);
actions.unshift(...[
toAction({ id: 'hideAccounts', label: localize('hideAccounts', "Hide Accounts"), run: () => this.storageService.store(AccountsActivityActionViewItem.ACCOUNTS_VISIBILITY_PREFERENCE_KEY, false, StorageScope.GLOBAL, StorageTarget.USER) }),
new Separator()
]);
return actions;
}
} }
export class GlobalActivityActionViewItem extends MenuActivityActionViewItem { export class GlobalActivityActionViewItem extends MenuActivityActionViewItem {
...@@ -375,7 +400,7 @@ registerAction2( ...@@ -375,7 +400,7 @@ registerAction2(
constructor() { constructor() {
super({ super({
id: 'workbench.action.previousSideBarView', id: 'workbench.action.previousSideBarView',
title: { value: nls.localize('previousSideBarView', "Previous Side Bar View"), original: 'Previous Side Bar View' }, title: { value: localize('previousSideBarView', "Previous Side Bar View"), original: 'Previous Side Bar View' },
category: CATEGORIES.View, category: CATEGORIES.View,
f1: true f1: true
}, -1); }, -1);
...@@ -388,7 +413,7 @@ registerAction2( ...@@ -388,7 +413,7 @@ registerAction2(
constructor() { constructor() {
super({ super({
id: 'workbench.action.nextSideBarView', id: 'workbench.action.nextSideBarView',
title: { value: nls.localize('nextSideBarView', "Next Side Bar View"), original: 'Next Side Bar View' }, title: { value: localize('nextSideBarView', "Next Side Bar View"), original: 'Next Side Bar View' },
category: CATEGORIES.View, category: CATEGORIES.View,
f1: true f1: true
}, 1); }, 1);
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
*--------------------------------------------------------------------------------------------*/ *--------------------------------------------------------------------------------------------*/
import 'vs/css!./media/activitybarpart'; import 'vs/css!./media/activitybarpart';
import * as nls from 'vs/nls'; import { localize } from 'vs/nls';
import { ActionsOrientation, ActionBar } from 'vs/base/browser/ui/actionbar/actionbar'; import { ActionsOrientation, ActionBar } from 'vs/base/browser/ui/actionbar/actionbar';
import { GLOBAL_ACTIVITY_ID, IActivity, ACCOUNTS_ACTIVITY_ID } from 'vs/workbench/common/activity'; import { GLOBAL_ACTIVITY_ID, IActivity, ACCOUNTS_ACTIVITY_ID } from 'vs/workbench/common/activity';
import { Part } from 'vs/workbench/browser/part'; import { Part } from 'vs/workbench/browser/part';
...@@ -35,7 +35,7 @@ import { getMenuBarVisibility } from 'vs/platform/windows/common/windows'; ...@@ -35,7 +35,7 @@ import { getMenuBarVisibility } from 'vs/platform/windows/common/windows';
import { isNative, isWeb } from 'vs/base/common/platform'; import { isNative, isWeb } from 'vs/base/common/platform';
import { Before2D } from 'vs/workbench/browser/dnd'; import { Before2D } from 'vs/workbench/browser/dnd';
import { Codicon, iconRegistry } from 'vs/base/common/codicons'; import { Codicon, iconRegistry } from 'vs/base/common/codicons';
import { Action, IAction, Separator } from 'vs/base/common/actions'; import { IAction, Separator, toAction } from 'vs/base/common/actions';
import { Event } from 'vs/base/common/event'; import { Event } from 'vs/base/common/event';
import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent';
import { KeyCode } from 'vs/base/common/keyCodes'; import { KeyCode } from 'vs/base/common/keyCodes';
...@@ -69,9 +69,6 @@ interface ICachedViewContainer { ...@@ -69,9 +69,6 @@ interface ICachedViewContainer {
views?: { when?: string; }[]; views?: { when?: string; }[];
} }
const settingsViewBarIcon = registerIcon('settings-view-bar-icon', Codicon.settingsGear, nls.localize('settingsViewBarIcon', 'Settings icon in the view bar.'));
const accountsViewBarIcon = registerIcon('accounts-view-bar-icon', Codicon.account, nls.localize('accountsViewBarIcon', 'Accounts icon in the view bar.'));
export class ActivitybarPart extends Part implements IActivityBarService { export class ActivitybarPart extends Part implements IActivityBarService {
declare readonly _serviceBrand: undefined; declare readonly _serviceBrand: undefined;
...@@ -81,6 +78,9 @@ export class ActivitybarPart extends Part implements IActivityBarService { ...@@ -81,6 +78,9 @@ export class ActivitybarPart extends Part implements IActivityBarService {
private static readonly ACTION_HEIGHT = 48; private static readonly ACTION_HEIGHT = 48;
private static readonly ACCOUNTS_ACTION_INDEX = 0; private static readonly ACCOUNTS_ACTION_INDEX = 0;
private static readonly GEAR_ICON = registerIcon('settings-view-bar-icon', Codicon.settingsGear, localize('settingsViewBarIcon', "Settings icon in the view bar."));
private static readonly ACCOUNTS_ICON = registerIcon('accounts-view-bar-icon', Codicon.account, localize('accountsViewBarIcon', "Accounts icon in the view bar."));
//#region IView //#region IView
readonly minimumWidth: number = 48; readonly minimumWidth: number = 48;
...@@ -164,7 +164,7 @@ export class ActivitybarPart extends Part implements IActivityBarService { ...@@ -164,7 +164,7 @@ export class ActivitybarPart extends Part implements IActivityBarService {
openComposite: compositeId => this.viewsService.openViewContainer(compositeId, true), openComposite: compositeId => this.viewsService.openViewContainer(compositeId, true),
getActivityAction: compositeId => this.getCompositeActions(compositeId).activityAction, getActivityAction: compositeId => this.getCompositeActions(compositeId).activityAction,
getCompositePinnedAction: compositeId => this.getCompositeActions(compositeId).pinnedAction, getCompositePinnedAction: compositeId => this.getCompositeActions(compositeId).pinnedAction,
getOnCompositeClickAction: compositeId => new Action(compositeId, '', '', true, () => this.viewsService.isViewContainerVisible(compositeId) ? Promise.resolve(this.viewsService.closeViewContainer(compositeId)) : this.viewsService.openViewContainer(compositeId)), getOnCompositeClickAction: compositeId => toAction({ id: compositeId, label: '', run: async () => this.viewsService.isViewContainerVisible(compositeId) ? this.viewsService.closeViewContainer(compositeId) : this.viewsService.openViewContainer(compositeId) }),
fillExtraContextMenuActions: actions => { fillExtraContextMenuActions: actions => {
// Home // Home
...@@ -172,9 +172,9 @@ export class ActivitybarPart extends Part implements IActivityBarService { ...@@ -172,9 +172,9 @@ export class ActivitybarPart extends Part implements IActivityBarService {
if (this.homeBarContainer) { if (this.homeBarContainer) {
topActions.push({ topActions.push({
id: 'toggleHomeBarAction', id: 'toggleHomeBarAction',
label: nls.localize('homeButton', "Home Button"), label: localize('homeButton', "Home Button"),
class: undefined, class: undefined,
tooltip: nls.localize('homeButton', "Home Button"), tooltip: localize('homeButton', "Home Button"),
checked: this.homeBarVisibilityPreference, checked: this.homeBarVisibilityPreference,
enabled: true, enabled: true,
run: async () => this.homeBarVisibilityPreference = !this.homeBarVisibilityPreference, run: async () => this.homeBarVisibilityPreference = !this.homeBarVisibilityPreference,
...@@ -187,9 +187,9 @@ export class ActivitybarPart extends Part implements IActivityBarService { ...@@ -187,9 +187,9 @@ export class ActivitybarPart extends Part implements IActivityBarService {
if (menuBarVisibility === 'compact' || (menuBarVisibility === 'hidden' && isWeb)) { if (menuBarVisibility === 'compact' || (menuBarVisibility === 'hidden' && isWeb)) {
topActions.push({ topActions.push({
id: 'toggleMenuVisibility', id: 'toggleMenuVisibility',
label: nls.localize('menu', "Menu"), label: localize('menu', "Menu"),
class: undefined, class: undefined,
tooltip: nls.localize('menu', "Menu"), tooltip: localize('menu', "Menu"),
checked: menuBarVisibility === 'compact', checked: menuBarVisibility === 'compact',
enabled: true, enabled: true,
run: async () => this.layoutService.toggleMenuBar(), run: async () => this.layoutService.toggleMenuBar(),
...@@ -205,9 +205,9 @@ export class ActivitybarPart extends Part implements IActivityBarService { ...@@ -205,9 +205,9 @@ export class ActivitybarPart extends Part implements IActivityBarService {
actions.push(new Separator()); actions.push(new Separator());
actions.push({ actions.push({
id: 'toggleAccountsVisibility', id: 'toggleAccountsVisibility',
label: nls.localize('accounts', "Accounts"), label: localize('accounts', "Accounts"),
class: undefined, class: undefined,
tooltip: nls.localize('accounts', "Accounts"), tooltip: localize('accounts', "Accounts"),
checked: this.accountsVisibilityPreference, checked: this.accountsVisibilityPreference,
enabled: true, enabled: true,
run: async () => this.accountsVisibilityPreference = !this.accountsVisibilityPreference, run: async () => this.accountsVisibilityPreference = !this.accountsVisibilityPreference,
...@@ -220,13 +220,7 @@ export class ActivitybarPart extends Part implements IActivityBarService { ...@@ -220,13 +220,7 @@ export class ActivitybarPart extends Part implements IActivityBarService {
actions.push(this.instantiationService.createInstance(ToggleSidebarPositionAction, ToggleSidebarPositionAction.ID, ToggleSidebarPositionAction.getLabel(this.layoutService))); actions.push(this.instantiationService.createInstance(ToggleSidebarPositionAction, ToggleSidebarPositionAction.ID, ToggleSidebarPositionAction.getLabel(this.layoutService)));
// Toggle Activity Bar // Toggle Activity Bar
actions.push(new Action( actions.push(toAction({ id: ToggleActivityBarVisibilityAction.ID, label: localize('hideActivitBar', "Hide Activity Bar"), run: async () => this.instantiationService.invokeFunction(accessor => new ToggleActivityBarVisibilityAction().run(accessor)) }));
ToggleActivityBarVisibilityAction.ID,
nls.localize('hideActivitBar', "Hide Activity Bar"),
undefined,
true,
async () => { this.instantiationService.invokeFunction(accessor => new ToggleActivityBarVisibilityAction().run(accessor)); }
));
}, },
getContextMenuActionsForComposite: compositeId => this.getContextMenuActionsForComposite(compositeId), getContextMenuActionsForComposite: compositeId => this.getContextMenuActionsForComposite(compositeId),
getDefaultCompositeId: () => this.viewDescriptorService.getDefaultViewContainer(this.location)!.id, getDefaultCompositeId: () => this.viewDescriptorService.getDefaultViewContainer(this.location)!.id,
...@@ -242,24 +236,20 @@ export class ActivitybarPart extends Part implements IActivityBarService { ...@@ -242,24 +236,20 @@ export class ActivitybarPart extends Part implements IActivityBarService {
})); }));
} }
private getContextMenuActionsForComposite(compositeId: string): Action[] { private getContextMenuActionsForComposite(compositeId: string): IAction[] {
const actions = []; const actions: IAction[] = [];
const viewContainer = this.viewDescriptorService.getViewContainerById(compositeId)!; const viewContainer = this.viewDescriptorService.getViewContainerById(compositeId)!;
const defaultLocation = this.viewDescriptorService.getDefaultViewContainerLocation(viewContainer)!; const defaultLocation = this.viewDescriptorService.getDefaultViewContainerLocation(viewContainer)!;
if (defaultLocation !== this.viewDescriptorService.getViewContainerLocation(viewContainer)) { if (defaultLocation !== this.viewDescriptorService.getViewContainerLocation(viewContainer)) {
actions.push(new Action('resetLocationAction', nls.localize('resetLocation', "Reset Location"), undefined, true, async () => { actions.push(toAction({ id: 'resetLocationAction', label: localize('resetLocation', "Reset Location"), run: () => this.viewDescriptorService.moveViewContainerToLocation(viewContainer, defaultLocation) }));
this.viewDescriptorService.moveViewContainerToLocation(viewContainer, defaultLocation);
}));
} else { } else {
const viewContainerModel = this.viewDescriptorService.getViewContainerModel(viewContainer); const viewContainerModel = this.viewDescriptorService.getViewContainerModel(viewContainer);
if (viewContainerModel.allViewDescriptors.length === 1) { if (viewContainerModel.allViewDescriptors.length === 1) {
const viewToReset = viewContainerModel.allViewDescriptors[0]; const viewToReset = viewContainerModel.allViewDescriptors[0];
const defaultContainer = this.viewDescriptorService.getDefaultContainerById(viewToReset.id)!; const defaultContainer = this.viewDescriptorService.getDefaultContainerById(viewToReset.id)!;
if (defaultContainer !== viewContainer) { if (defaultContainer !== viewContainer) {
actions.push(new Action('resetLocationAction', nls.localize('resetLocation', "Reset Location"), undefined, true, async () => { actions.push(toAction({ id: 'resetLocationAction', label: localize('resetLocation', "Reset Location"), run: () => this.viewDescriptorService.moveViewsToContainer([viewToReset], defaultContainer) }));
this.viewDescriptorService.moveViewsToContainer([viewToReset], defaultContainer);
}));
} }
} }
} }
...@@ -575,14 +565,14 @@ export class ActivitybarPart extends Part implements IActivityBarService { ...@@ -575,14 +565,14 @@ export class ActivitybarPart extends Part implements IActivityBarService {
private createHomeBar(href: string, icon: Codicon): void { private createHomeBar(href: string, icon: Codicon): void {
this.homeBarContainer = document.createElement('div'); this.homeBarContainer = document.createElement('div');
this.homeBarContainer.setAttribute('aria-label', nls.localize('homeIndicator', "Home")); this.homeBarContainer.setAttribute('aria-label', localize('homeIndicator', "Home"));
this.homeBarContainer.setAttribute('role', 'toolbar'); this.homeBarContainer.setAttribute('role', 'toolbar');
this.homeBarContainer.classList.add('home-bar'); this.homeBarContainer.classList.add('home-bar');
this.homeBar = this._register(new ActionBar(this.homeBarContainer, { this.homeBar = this._register(new ActionBar(this.homeBarContainer, {
actionViewItemProvider: action => this.instantiationService.createInstance(HomeActivityActionViewItem, href, action as ActivityAction, () => this.compositeBar.getContextMenuActions(), (theme: IColorTheme) => this.getActivitybarItemColors(theme)), actionViewItemProvider: action => this.instantiationService.createInstance(HomeActivityActionViewItem, href, action as ActivityAction, () => this.compositeBar.getContextMenuActions(), (theme: IColorTheme) => this.getActivitybarItemColors(theme)),
orientation: ActionsOrientation.VERTICAL, orientation: ActionsOrientation.VERTICAL,
ariaLabel: nls.localize('home', "Home"), ariaLabel: localize('home', "Home"),
animated: false, animated: false,
preventLoopNavigation: true, preventLoopNavigation: true,
ignoreOrientationForPreviousAndNextKey: true ignoreOrientationForPreviousAndNextKey: true
...@@ -594,7 +584,7 @@ export class ActivitybarPart extends Part implements IActivityBarService { ...@@ -594,7 +584,7 @@ export class ActivitybarPart extends Part implements IActivityBarService {
this.homeBar.push(this._register(new ActivityAction({ this.homeBar.push(this._register(new ActivityAction({
id: 'workbench.actions.home', id: 'workbench.actions.home',
name: nls.localize('home', "Home"), name: localize('home', "Home"),
cssClass: icon.classNames cssClass: icon.classNames
}))); })));
...@@ -616,7 +606,7 @@ export class ActivitybarPart extends Part implements IActivityBarService { ...@@ -616,7 +606,7 @@ export class ActivitybarPart extends Part implements IActivityBarService {
throw new Error(`No view item for action '${action.id}'`); throw new Error(`No view item for action '${action.id}'`);
}, },
orientation: ActionsOrientation.VERTICAL, orientation: ActionsOrientation.VERTICAL,
ariaLabel: nls.localize('manage', "Manage"), ariaLabel: localize('manage', "Manage"),
animated: false, animated: false,
preventLoopNavigation: true, preventLoopNavigation: true,
ignoreOrientationForPreviousAndNextKey: true ignoreOrientationForPreviousAndNextKey: true
...@@ -624,15 +614,15 @@ export class ActivitybarPart extends Part implements IActivityBarService { ...@@ -624,15 +614,15 @@ export class ActivitybarPart extends Part implements IActivityBarService {
this.globalActivityAction = this._register(new ActivityAction({ this.globalActivityAction = this._register(new ActivityAction({
id: 'workbench.actions.manage', id: 'workbench.actions.manage',
name: nls.localize('manage', "Manage"), name: localize('manage', "Manage"),
cssClass: ThemeIcon.asClassName(settingsViewBarIcon) cssClass: ThemeIcon.asClassName(ActivitybarPart.GEAR_ICON)
})); }));
if (this.accountsVisibilityPreference) { if (this.accountsVisibilityPreference) {
this.accountsActivityAction = this._register(new ActivityAction({ this.accountsActivityAction = this._register(new ActivityAction({
id: 'workbench.actions.accounts', id: 'workbench.actions.accounts',
name: nls.localize('accounts', "Accounts"), name: localize('accounts', "Accounts"),
cssClass: ThemeIcon.asClassName(accountsViewBarIcon) cssClass: ThemeIcon.asClassName(ActivitybarPart.ACCOUNTS_ICON)
})); }));
this.globalActivityActionBar.push(this.accountsActivityAction, { index: ActivitybarPart.ACCOUNTS_ACTION_INDEX }); this.globalActivityActionBar.push(this.accountsActivityAction, { index: ActivitybarPart.ACCOUNTS_ACTION_INDEX });
...@@ -649,7 +639,7 @@ export class ActivitybarPart extends Part implements IActivityBarService { ...@@ -649,7 +639,7 @@ export class ActivitybarPart extends Part implements IActivityBarService {
} else { } else {
this.accountsActivityAction = this._register(new ActivityAction({ this.accountsActivityAction = this._register(new ActivityAction({
id: 'workbench.actions.accounts', id: 'workbench.actions.accounts',
name: nls.localize('accounts', "Accounts"), name: localize('accounts', "Accounts"),
cssClass: Codicon.account.classNames cssClass: Codicon.account.classNames
})); }));
this.globalActivityActionBar.push(this.accountsActivityAction, { index: ActivitybarPart.ACCOUNTS_ACTION_INDEX }); this.globalActivityActionBar.push(this.accountsActivityAction, { index: ActivitybarPart.ACCOUNTS_ACTION_INDEX });
...@@ -1088,7 +1078,7 @@ class FocusActivityBarAction extends Action2 { ...@@ -1088,7 +1078,7 @@ class FocusActivityBarAction extends Action2 {
constructor() { constructor() {
super({ super({
id: 'workbench.action.focusActivityBar', id: 'workbench.action.focusActivityBar',
title: { value: nls.localize('focusActivityBar', "Focus Activity Bar"), original: 'Focus Activity Bar' }, title: { value: localize('focusActivityBar', "Focus Activity Bar"), original: 'Focus Activity Bar' },
category: CATEGORIES.View, category: CATEGORIES.View,
f1: true f1: true
}); });
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
*--------------------------------------------------------------------------------------------*/ *--------------------------------------------------------------------------------------------*/
import * as nls from 'vs/nls'; import * as nls from 'vs/nls';
import { Action, IAction } from 'vs/base/common/actions'; import { IAction, toAction } from 'vs/base/common/actions';
import { illegalArgument } from 'vs/base/common/errors'; import { illegalArgument } from 'vs/base/common/errors';
import * as arrays from 'vs/base/common/arrays'; import * as arrays from 'vs/base/common/arrays';
import { IDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { IDisposable, toDisposable } from 'vs/base/common/lifecycle';
...@@ -149,10 +149,10 @@ export interface ICompositeBarOptions { ...@@ -149,10 +149,10 @@ export interface ICompositeBarOptions {
readonly preventLoopNavigation?: boolean; readonly preventLoopNavigation?: boolean;
getActivityAction: (compositeId: string) => ActivityAction; getActivityAction: (compositeId: string) => ActivityAction;
getCompositePinnedAction: (compositeId: string) => Action; getCompositePinnedAction: (compositeId: string) => IAction;
getOnCompositeClickAction: (compositeId: string) => Action; getOnCompositeClickAction: (compositeId: string) => IAction;
fillExtraContextMenuActions: (actions: IAction[]) => void; fillExtraContextMenuActions: (actions: IAction[]) => void;
getContextMenuActionsForComposite: (compositeId: string) => Action[]; getContextMenuActionsForComposite: (compositeId: string) => IAction[];
openComposite: (compositeId: string) => Promise<IComposite | null>; openComposite: (compositeId: string) => Promise<IComposite | null>;
getDefaultCompositeId: () => string; getDefaultCompositeId: () => string;
hidePart: () => void; hidePart: () => void;
...@@ -208,15 +208,15 @@ export class CompositeBar extends Widget implements ICompositeBar { ...@@ -208,15 +208,15 @@ export class CompositeBar extends Widget implements ICompositeBar {
create(parent: HTMLElement): HTMLElement { create(parent: HTMLElement): HTMLElement {
const actionBarDiv = parent.appendChild($('.composite-bar')); const actionBarDiv = parent.appendChild($('.composite-bar'));
this.compositeSwitcherBar = this._register(new ActionBar(actionBarDiv, { this.compositeSwitcherBar = this._register(new ActionBar(actionBarDiv, {
actionViewItemProvider: (action: IAction) => { actionViewItemProvider: action => {
if (action instanceof CompositeOverflowActivityAction) { if (action instanceof CompositeOverflowActivityAction) {
return this.compositeOverflowActionViewItem; return this.compositeOverflowActionViewItem;
} }
const item = this.model.findItem(action.id); const item = this.model.findItem(action.id);
return item && this.instantiationService.createInstance( return item && this.instantiationService.createInstance(
CompositeActionViewItem, action as ActivityAction, item.pinnedAction, CompositeActionViewItem, action as ActivityAction, item.pinnedAction,
(compositeId: string) => this.options.getContextMenuActionsForComposite(compositeId), compositeId => this.options.getContextMenuActionsForComposite(compositeId),
() => this.getContextMenuActions() as Action[], () => this.getContextMenuActions(),
this.options.colors, this.options.colors,
this.options.icon, this.options.icon,
this.options.dndHandler, this.options.dndHandler,
...@@ -596,7 +596,7 @@ export class CompositeBar extends Widget implements ICompositeBar { ...@@ -596,7 +596,7 @@ export class CompositeBar extends Widget implements ICompositeBar {
this.compositeOverflowAction, this.compositeOverflowAction,
() => this.getOverflowingComposites(), () => this.getOverflowingComposites(),
() => this.model.activeItem ? this.model.activeItem.id : undefined, () => this.model.activeItem ? this.model.activeItem.id : undefined,
(compositeId: string) => { compositeId => {
const item = this.model.findItem(compositeId); const item = this.model.findItem(compositeId);
return item?.activity[0]?.badge; return item?.activity[0]?.badge;
}, },
...@@ -633,7 +633,7 @@ export class CompositeBar extends Widget implements ICompositeBar { ...@@ -633,7 +633,7 @@ export class CompositeBar extends Widget implements ICompositeBar {
getContextMenuActions(): IAction[] { getContextMenuActions(): IAction[] {
const actions: IAction[] = this.model.visibleItems const actions: IAction[] = this.model.visibleItems
.map(({ id, name, activityAction }) => (<IAction>{ .map(({ id, name, activityAction }) => (toAction({
id, id,
label: this.getAction(id).label || name || id, label: this.getAction(id).label || name || id,
checked: this.isPinned(id), checked: this.isPinned(id),
...@@ -645,7 +645,7 @@ export class CompositeBar extends Widget implements ICompositeBar { ...@@ -645,7 +645,7 @@ export class CompositeBar extends Widget implements ICompositeBar {
this.pin(id, true); this.pin(id, true);
} }
} }
})); })));
this.options.fillExtraContextMenuActions(actions); this.options.fillExtraContextMenuActions(actions);
...@@ -655,7 +655,7 @@ export class CompositeBar extends Widget implements ICompositeBar { ...@@ -655,7 +655,7 @@ export class CompositeBar extends Widget implements ICompositeBar {
interface ICompositeBarModelItem extends ICompositeBarItem { interface ICompositeBarModelItem extends ICompositeBarItem {
activityAction: ActivityAction; activityAction: ActivityAction;
pinnedAction: Action; pinnedAction: IAction;
activity: ICompositeActivity[]; activity: ICompositeActivity[];
} }
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
*--------------------------------------------------------------------------------------------*/ *--------------------------------------------------------------------------------------------*/
import * as nls from 'vs/nls'; import * as nls from 'vs/nls';
import { Action, Separator } from 'vs/base/common/actions'; import { Action, IAction, Separator } from 'vs/base/common/actions';
import * as dom from 'vs/base/browser/dom'; import * as dom from 'vs/base/browser/dom';
import { ICommandService } from 'vs/platform/commands/common/commands'; import { ICommandService } from 'vs/platform/commands/common/commands';
import { dispose, toDisposable, MutableDisposable } from 'vs/base/common/lifecycle'; import { dispose, toDisposable, MutableDisposable } from 'vs/base/common/lifecycle';
...@@ -374,14 +374,14 @@ export class CompositeOverflowActivityAction extends ActivityAction { ...@@ -374,14 +374,14 @@ export class CompositeOverflowActivityAction extends ActivityAction {
} }
export class CompositeOverflowActivityActionViewItem extends ActivityActionViewItem { export class CompositeOverflowActivityActionViewItem extends ActivityActionViewItem {
private actions: Action[] = []; private actions: IAction[] = [];
constructor( constructor(
action: ActivityAction, action: ActivityAction,
private getOverflowingComposites: () => { id: string, name?: string }[], private getOverflowingComposites: () => { id: string, name?: string }[],
private getActiveCompositeId: () => string | undefined, private getActiveCompositeId: () => string | undefined,
private getBadge: (compositeId: string) => IBadge, private getBadge: (compositeId: string) => IBadge,
private getCompositeOpenAction: (compositeId: string) => Action, private getCompositeOpenAction: (compositeId: string) => IAction,
colors: (theme: IColorTheme) => ICompositeBarColors, colors: (theme: IColorTheme) => ICompositeBarColors,
@IContextMenuService private readonly contextMenuService: IContextMenuService, @IContextMenuService private readonly contextMenuService: IContextMenuService,
@IThemeService themeService: IThemeService @IThemeService themeService: IThemeService
...@@ -404,7 +404,7 @@ export class CompositeOverflowActivityActionViewItem extends ActivityActionViewI ...@@ -404,7 +404,7 @@ export class CompositeOverflowActivityActionViewItem extends ActivityActionViewI
}); });
} }
private getActions(): Action[] { private getActions(): IAction[] {
return this.getOverflowingComposites().map(composite => { return this.getOverflowingComposites().map(composite => {
const action = this.getCompositeOpenAction(composite.id); const action = this.getCompositeOpenAction(composite.id);
action.checked = this.getActiveCompositeId() === action.id; action.checked = this.getActiveCompositeId() === action.id;
...@@ -457,9 +457,9 @@ export class CompositeActionViewItem extends ActivityActionViewItem { ...@@ -457,9 +457,9 @@ export class CompositeActionViewItem extends ActivityActionViewItem {
constructor( constructor(
private compositeActivityAction: ActivityAction, private compositeActivityAction: ActivityAction,
private toggleCompositePinnedAction: Action, private toggleCompositePinnedAction: IAction,
private compositeContextMenuActionsProvider: (compositeId: string) => ReadonlyArray<Action>, private compositeContextMenuActionsProvider: (compositeId: string) => IAction[],
private contextMenuActionsProvider: () => ReadonlyArray<Action>, private contextMenuActionsProvider: () => IAction[],
colors: (theme: IColorTheme) => ICompositeBarColors, colors: (theme: IColorTheme) => ICompositeBarColors,
icon: boolean, icon: boolean,
private dndHandler: ICompositeDragAndDrop, private dndHandler: ICompositeDragAndDrop,
...@@ -606,7 +606,7 @@ export class CompositeActionViewItem extends ActivityActionViewItem { ...@@ -606,7 +606,7 @@ export class CompositeActionViewItem extends ActivityActionViewItem {
} }
private showContextMenu(container: HTMLElement): void { private showContextMenu(container: HTMLElement): void {
const actions: Action[] = [this.toggleCompositePinnedAction]; const actions: IAction[] = [this.toggleCompositePinnedAction];
const compositeContextMenuActions = this.compositeContextMenuActionsProvider(this.activity.id); const compositeContextMenuActions = this.compositeContextMenuActionsProvider(this.activity.id);
if (compositeContextMenuActions.length) { if (compositeContextMenuActions.length) {
......
...@@ -4,7 +4,8 @@ ...@@ -4,7 +4,8 @@
*--------------------------------------------------------------------------------------------*/ *--------------------------------------------------------------------------------------------*/
import 'vs/css!./media/panelpart'; import 'vs/css!./media/panelpart';
import { IAction, Action, Separator } from 'vs/base/common/actions'; import { localize } from 'vs/nls';
import { IAction, Separator } from 'vs/base/common/actions';
import { Event } from 'vs/base/common/event'; import { Event } from 'vs/base/common/event';
import { Registry } from 'vs/platform/registry/common/platform'; import { Registry } from 'vs/platform/registry/common/platform';
import { ActionsOrientation } from 'vs/base/browser/ui/actionbar/actionbar'; import { ActionsOrientation } from 'vs/base/browser/ui/actionbar/actionbar';
...@@ -27,7 +28,6 @@ import { ToggleCompositePinnedAction } from 'vs/workbench/browser/parts/composit ...@@ -27,7 +28,6 @@ import { ToggleCompositePinnedAction } from 'vs/workbench/browser/parts/composit
import { IBadge } from 'vs/workbench/services/activity/common/activity'; import { IBadge } from 'vs/workbench/services/activity/common/activity';
import { INotificationService } from 'vs/platform/notification/common/notification'; import { INotificationService } from 'vs/platform/notification/common/notification';
import { Dimension, trackFocus, EventHelper } from 'vs/base/browser/dom'; import { Dimension, trackFocus, EventHelper } from 'vs/base/browser/dom';
import { localize } from 'vs/nls';
import { IDisposable, DisposableStore, MutableDisposable } from 'vs/base/common/lifecycle'; import { IDisposable, DisposableStore, MutableDisposable } from 'vs/base/common/lifecycle';
import { IContextKey, IContextKeyService, ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { IContextKey, IContextKeyService, ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey';
import { isUndefinedOrNull, assertIsDefined } from 'vs/base/common/types'; import { isUndefinedOrNull, assertIsDefined } from 'vs/base/common/types';
...@@ -163,7 +163,7 @@ export class PanelPart extends CompositePart<Panel> implements IPanelService { ...@@ -163,7 +163,7 @@ export class PanelPart extends CompositePart<Panel> implements IPanelService {
this.instantiationService.createInstance(TogglePanelAction, TogglePanelAction.ID, localize('hidePanel', "Hide Panel")) this.instantiationService.createInstance(TogglePanelAction, TogglePanelAction.ID, localize('hidePanel', "Hide Panel"))
]); ]);
}, },
getContextMenuActionsForComposite: compositeId => this.getContextMenuActionsForComposite(compositeId) as Action[], getContextMenuActionsForComposite: compositeId => this.getContextMenuActionsForComposite(compositeId),
getDefaultCompositeId: () => this.panelRegistry.getDefaultPanelId(), getDefaultCompositeId: () => this.panelRegistry.getDefaultPanelId(),
hidePart: () => this.layoutService.setPanelHidden(true), hidePart: () => this.layoutService.setPanelHidden(true),
dndHandler: this.dndHandler, dndHandler: this.dndHandler,
...@@ -189,7 +189,7 @@ export class PanelPart extends CompositePart<Panel> implements IPanelService { ...@@ -189,7 +189,7 @@ export class PanelPart extends CompositePart<Panel> implements IPanelService {
} }
private readonly panelContextMenuActionsDisposable = this._register(new MutableDisposable()); private readonly panelContextMenuActionsDisposable = this._register(new MutableDisposable());
private getContextMenuActionsForComposite(compositeId: string): readonly IAction[] { private getContextMenuActionsForComposite(compositeId: string): IAction[] {
const result: IAction[] = []; const result: IAction[] = [];
const scopedContextKeyService = this.contextKeyService.createScoped(); const scopedContextKeyService = this.contextKeyService.createScoped();
scopedContextKeyService.createKey('viewContainer', compositeId); scopedContextKeyService.createKey('viewContainer', compositeId);
......
...@@ -6,7 +6,6 @@ ...@@ -6,7 +6,6 @@
import 'vs/css!./media/sidebarpart'; import 'vs/css!./media/sidebarpart';
import * as nls from 'vs/nls'; import * as nls from 'vs/nls';
import { Registry } from 'vs/platform/registry/common/platform'; import { Registry } from 'vs/platform/registry/common/platform';
import { Action } from 'vs/base/common/actions';
import { CompositePart } from 'vs/workbench/browser/parts/compositePart'; import { CompositePart } from 'vs/workbench/browser/parts/compositePart';
import { Viewlet, ViewletRegistry, Extensions as ViewletExtensions, ViewletDescriptor } from 'vs/workbench/browser/viewlet'; import { Viewlet, ViewletRegistry, Extensions as ViewletExtensions, ViewletDescriptor } from 'vs/workbench/browser/viewlet';
import { Action2, registerAction2 } from 'vs/platform/actions/common/actions'; import { Action2, registerAction2 } from 'vs/platform/actions/common/actions';
...@@ -289,7 +288,7 @@ export class SidebarPart extends CompositePart<Viewlet> implements IViewletServi ...@@ -289,7 +288,7 @@ export class SidebarPart extends CompositePart<Viewlet> implements IViewletServi
this.contextMenuService.showContextMenu({ this.contextMenuService.showContextMenu({
getAnchor: () => anchor, getAnchor: () => anchor,
getActions: () => contextMenuActions.slice(), getActions: () => contextMenuActions.slice(),
getActionViewItem: action => this.actionViewItemProvider(action as Action), getActionViewItem: action => this.actionViewItemProvider(action),
actionRunner: activeViewlet.getActionRunner() actionRunner: activeViewlet.getActionRunner()
}); });
} }
......
...@@ -611,7 +611,7 @@ export class StatusbarPart extends Part implements IStatusbarService { ...@@ -611,7 +611,7 @@ export class StatusbarPart extends Part implements IStatusbarService {
} }
private getContextMenuActions(event: StandardMouseEvent): IAction[] { private getContextMenuActions(event: StandardMouseEvent): IAction[] {
const actions: Action[] = []; const actions: IAction[] = [];
// Provide an action to hide the status bar at last // Provide an action to hide the status bar at last
actions.push(this.instantiationService.createInstance(ToggleStatusbarVisibilityAction, ToggleStatusbarVisibilityAction.ID, nls.localize('hideStatusBar', "Hide Status Bar"))); actions.push(this.instantiationService.createInstance(ToggleStatusbarVisibilityAction, ToggleStatusbarVisibilityAction.ID, nls.localize('hideStatusBar', "Hide Status Bar")));
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
*--------------------------------------------------------------------------------------------*/ *--------------------------------------------------------------------------------------------*/
import 'vs/css!./media/titlebarpart'; import 'vs/css!./media/titlebarpart';
import { localize } from 'vs/nls';
import { dirname, basename } from 'vs/base/common/resources'; import { dirname, basename } from 'vs/base/common/resources';
import { Part } from 'vs/workbench/browser/part'; import { Part } from 'vs/workbench/browser/part';
import { ITitleService, ITitleProperties } from 'vs/workbench/services/title/common/titleService'; import { ITitleService, ITitleProperties } from 'vs/workbench/services/title/common/titleService';
...@@ -15,7 +16,6 @@ import { IAction } from 'vs/base/common/actions'; ...@@ -15,7 +16,6 @@ import { IAction } from 'vs/base/common/actions';
import { IConfigurationService, IConfigurationChangeEvent } from 'vs/platform/configuration/common/configuration'; import { IConfigurationService, IConfigurationChangeEvent } from 'vs/platform/configuration/common/configuration';
import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService';
import { DisposableStore, dispose } from 'vs/base/common/lifecycle'; import { DisposableStore, dispose } from 'vs/base/common/lifecycle';
import * as nls from 'vs/nls';
import { EditorResourceAccessor, Verbosity, SideBySideEditor } from 'vs/workbench/common/editor'; import { EditorResourceAccessor, Verbosity, SideBySideEditor } from 'vs/workbench/common/editor';
import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService';
import { IWorkspaceContextService, WorkbenchState, IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; import { IWorkspaceContextService, WorkbenchState, IWorkspaceFolder } from 'vs/platform/workspace/common/workspace';
...@@ -44,9 +44,9 @@ import { withNullAsUndefined } from 'vs/base/common/types'; ...@@ -44,9 +44,9 @@ import { withNullAsUndefined } from 'vs/base/common/types';
export class TitlebarPart extends Part implements ITitleService { export class TitlebarPart extends Part implements ITitleService {
private static readonly NLS_UNSUPPORTED = nls.localize('patchedWindowTitle', "[Unsupported]"); private static readonly NLS_UNSUPPORTED = localize('patchedWindowTitle', "[Unsupported]");
private static readonly NLS_USER_IS_ADMIN = isWindows ? nls.localize('userIsAdmin', "[Administrator]") : nls.localize('userIsSudo', "[Superuser]"); private static readonly NLS_USER_IS_ADMIN = isWindows ? localize('userIsAdmin', "[Administrator]") : localize('userIsSudo', "[Superuser]");
private static readonly NLS_EXTENSION_HOST = nls.localize('devExtensionWindowTitlePrefix', "[Extension Development Host]"); private static readonly NLS_EXTENSION_HOST = localize('devExtensionWindowTitlePrefix', "[Extension Development Host]");
private static readonly TITLE_DIRTY = '\u25cf '; private static readonly TITLE_DIRTY = '\u25cf ';
//#region IView //#region IView
......
...@@ -3,12 +3,12 @@ ...@@ -3,12 +3,12 @@
* Licensed under the MIT License. See License.txt in the project root for license information. * Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/ *--------------------------------------------------------------------------------------------*/
import * as nls from 'vs/nls'; import { localize } from 'vs/nls';
import { toErrorMessage } from 'vs/base/common/errorMessage'; import { toErrorMessage } from 'vs/base/common/errorMessage';
import { isFunction, assertIsDefined } from 'vs/base/common/types'; import { isFunction, assertIsDefined } from 'vs/base/common/types';
import { isValidBasename } from 'vs/base/common/extpath'; import { isValidBasename } from 'vs/base/common/extpath';
import { basename } from 'vs/base/common/resources'; import { basename } from 'vs/base/common/resources';
import { Action } from 'vs/base/common/actions'; import { toAction } from 'vs/base/common/actions';
import { VIEWLET_ID, TEXT_FILE_EDITOR_ID } from 'vs/workbench/contrib/files/common/files'; import { VIEWLET_ID, TEXT_FILE_EDITOR_ID } from 'vs/workbench/contrib/files/common/files';
import { ITextFileService, TextFileOperationError, TextFileOperationResult } from 'vs/workbench/services/textfile/common/textfiles'; import { ITextFileService, TextFileOperationError, TextFileOperationResult } from 'vs/workbench/services/textfile/common/textfiles';
import { BaseTextEditor } from 'vs/workbench/browser/parts/editor/textEditor'; import { BaseTextEditor } from 'vs/workbench/browser/parts/editor/textEditor';
...@@ -97,7 +97,7 @@ export class TextFileEditor extends BaseTextEditor { ...@@ -97,7 +97,7 @@ export class TextFileEditor extends BaseTextEditor {
} }
getTitle(): string { getTitle(): string {
return this.input ? this.input.getName() : nls.localize('textFileEditor', "Text File Editor"); return this.input ? this.input.getName() : localize('textFileEditor', "Text File Editor");
} }
get input(): FileEditorInput | undefined { get input(): FileEditorInput | undefined {
...@@ -169,22 +169,24 @@ export class TextFileEditor extends BaseTextEditor { ...@@ -169,22 +169,24 @@ export class TextFileEditor extends BaseTextEditor {
if ((<FileOperationError>error).fileOperationResult === FileOperationResult.FILE_IS_DIRECTORY) { if ((<FileOperationError>error).fileOperationResult === FileOperationResult.FILE_IS_DIRECTORY) {
this.openAsFolder(input); this.openAsFolder(input);
throw new Error(nls.localize('openFolderError', "File is a directory")); throw new Error(localize('openFolderError', "File is a directory"));
} }
// Offer to create a file from the error if we have a file not found and the name is valid // Offer to create a file from the error if we have a file not found and the name is valid
if ((<FileOperationError>error).fileOperationResult === FileOperationResult.FILE_NOT_FOUND && isValidBasename(basename(input.preferredResource))) { if ((<FileOperationError>error).fileOperationResult === FileOperationResult.FILE_NOT_FOUND && isValidBasename(basename(input.preferredResource))) {
throw createErrorWithActions(toErrorMessage(error), { throw createErrorWithActions(toErrorMessage(error), {
actions: [ actions: [
new Action('workbench.files.action.createMissingFile', nls.localize('createFile', "Create File"), undefined, true, async () => { toAction({
await this.textFileService.create([{ resource: input.preferredResource }]); id: 'workbench.files.action.createMissingFile', label: localize('createFile', "Create File"), run: async () => {
await this.textFileService.create([{ resource: input.preferredResource }]);
return this.editorService.openEditor({
resource: input.preferredResource, return this.editorService.openEditor({
options: { resource: input.preferredResource,
pinned: true // new file gets pinned by default options: {
} pinned: true // new file gets pinned by default
}); }
});
}
}) })
] ]
}); });
......
...@@ -3,13 +3,13 @@ ...@@ -3,13 +3,13 @@
* Licensed under the MIT License. See License.txt in the project root for license information. * Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/ *--------------------------------------------------------------------------------------------*/
import * as nls from 'vs/nls'; import { localize } from 'vs/nls';
import { TextFileEditor } from 'vs/workbench/contrib/files/browser/editors/textFileEditor'; import { TextFileEditor } from 'vs/workbench/contrib/files/browser/editors/textFileEditor';
import { FileEditorInput } from 'vs/workbench/contrib/files/common/editors/fileEditorInput'; import { FileEditorInput } from 'vs/workbench/contrib/files/common/editors/fileEditorInput';
import { EditorOptions } from 'vs/workbench/common/editor'; import { EditorOptions } from 'vs/workbench/common/editor';
import { FileOperationError, FileOperationResult, IFileService, MIN_MAX_MEMORY_SIZE_MB, FALLBACK_MAX_MEMORY_SIZE_MB } from 'vs/platform/files/common/files'; import { FileOperationError, FileOperationResult, IFileService, MIN_MAX_MEMORY_SIZE_MB, FALLBACK_MAX_MEMORY_SIZE_MB } from 'vs/platform/files/common/files';
import { createErrorWithActions } from 'vs/base/common/errorsWithActions'; import { createErrorWithActions } from 'vs/base/common/errorsWithActions';
import { Action } from 'vs/base/common/actions'; import { toAction } from 'vs/base/common/actions';
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet';
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
...@@ -56,18 +56,22 @@ export class NativeTextFileEditor extends TextFileEditor { ...@@ -56,18 +56,22 @@ export class NativeTextFileEditor extends TextFileEditor {
if ((<FileOperationError>error).fileOperationResult === FileOperationResult.FILE_EXCEEDS_MEMORY_LIMIT) { if ((<FileOperationError>error).fileOperationResult === FileOperationResult.FILE_EXCEEDS_MEMORY_LIMIT) {
const memoryLimit = Math.max(MIN_MAX_MEMORY_SIZE_MB, +this.textResourceConfigurationService.getValue<number>(undefined, 'files.maxMemoryForLargeFilesMB') || FALLBACK_MAX_MEMORY_SIZE_MB); const memoryLimit = Math.max(MIN_MAX_MEMORY_SIZE_MB, +this.textResourceConfigurationService.getValue<number>(undefined, 'files.maxMemoryForLargeFilesMB') || FALLBACK_MAX_MEMORY_SIZE_MB);
throw createErrorWithActions(nls.localize('fileTooLargeForHeapError', "To open a file of this size, you need to restart and allow it to use more memory"), { throw createErrorWithActions(localize('fileTooLargeForHeapError', "To open a file of this size, you need to restart and allow it to use more memory"), {
actions: [ actions: [
new Action('workbench.window.action.relaunchWithIncreasedMemoryLimit', nls.localize('relaunchWithIncreasedMemoryLimit', "Restart with {0} MB", memoryLimit), undefined, true, () => { toAction({
return this.nativeHostService.relaunch({ id: 'workbench.window.action.relaunchWithIncreasedMemoryLimit', label: localize('relaunchWithIncreasedMemoryLimit', "Restart with {0} MB", memoryLimit), run: () => {
addArgs: [ return this.nativeHostService.relaunch({
`--max-memory=${memoryLimit}` addArgs: [
] `--max-memory=${memoryLimit}`
}); ]
});
}
}),
toAction({
id: 'workbench.window.action.configureMemoryLimit', label: localize('configureMemoryLimit', 'Configure Memory Limit'), run: () => {
return this.preferencesService.openGlobalSettings(undefined, { query: 'files.maxMemoryForLargeFilesMB' });
}
}), }),
new Action('workbench.window.action.configureMemoryLimit', nls.localize('configureMemoryLimit', 'Configure Memory Limit'), undefined, true, () => {
return this.preferencesService.openGlobalSettings(undefined, { query: 'files.maxMemoryForLargeFilesMB' });
})
] ]
}); });
} }
......
...@@ -7,9 +7,9 @@ ...@@ -7,9 +7,9 @@
const path = require('path'); const path = require('path');
const glob = require('glob'); const glob = require('glob');
const fs = require('fs');
const events = require('events'); const events = require('events');
const mocha = require('mocha'); const mocha = require('mocha');
const createStatsCollector = require('../../../node_modules/mocha/lib/stats-collector');
const MochaJUnitReporter = require('mocha-junit-reporter'); const MochaJUnitReporter = require('mocha-junit-reporter');
const url = require('url'); const url = require('url');
const minimatch = require('minimatch'); const minimatch = require('minimatch');
...@@ -186,6 +186,7 @@ class EchoRunner extends events.EventEmitter { ...@@ -186,6 +186,7 @@ class EchoRunner extends events.EventEmitter {
constructor(event, title = '') { constructor(event, title = '') {
super(); super();
createStatsCollector(this);
event.on('start', () => this.emit('start')); event.on('start', () => this.emit('start'));
event.on('end', () => this.emit('end')); event.on('end', () => this.emit('end'));
event.on('suite', (suite) => this.emit('suite', EchoRunner.deserializeSuite(suite, title))); event.on('suite', (suite) => this.emit('suite', EchoRunner.deserializeSuite(suite, title)));
...@@ -218,6 +219,7 @@ class EchoRunner extends events.EventEmitter { ...@@ -218,6 +219,7 @@ class EchoRunner extends events.EventEmitter {
return { return {
title: runnable.title, title: runnable.title,
fullTitle: () => titleExtra && runnable.fullTitle ? `${runnable.fullTitle} - /${titleExtra}/` : runnable.fullTitle, fullTitle: () => titleExtra && runnable.fullTitle ? `${runnable.fullTitle} - /${titleExtra}/` : runnable.fullTitle,
titlePath: () => runnable.titlePath,
async: runnable.async, async: runnable.async,
slow: () => runnable.slow, slow: () => runnable.slow,
speed: runnable.speed, speed: runnable.speed,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册