From 82eb47c42dc17d495c77600456b8fc6749601c51 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Tue, 30 May 2017 15:29:42 +0200 Subject: [PATCH] Fix #27535 --- .../electron-browser/mainThreadTreeViews.ts | 3 +- src/vs/workbench/api/node/extHost.protocol.ts | 20 ++------ src/vs/workbench/api/node/extHostTreeViews.ts | 45 ++++++++--------- .../workbench/parts/views/browser/treeView.ts | 9 ++-- src/vs/workbench/parts/views/browser/views.ts | 37 +------------- src/vs/workbench/parts/views/common/views.ts | 48 +++++++++++++++++++ 6 files changed, 81 insertions(+), 81 deletions(-) create mode 100644 src/vs/workbench/parts/views/common/views.ts diff --git a/src/vs/workbench/api/electron-browser/mainThreadTreeViews.ts b/src/vs/workbench/api/electron-browser/mainThreadTreeViews.ts index 186c646eace..6d41b483db6 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadTreeViews.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadTreeViews.ts @@ -9,7 +9,8 @@ import { TPromise } from 'vs/base/common/winjs.base'; import { IThreadService } from 'vs/workbench/services/thread/common/threadService'; import { ExtHostContext, MainThreadTreeViewsShape, ExtHostTreeViewsShape } from '../node/extHost.protocol'; import { IMessageService, Severity } from 'vs/platform/message/common/message'; -import { ViewsRegistry, ITreeViewDataProvider, ITreeItem, TreeItemCollapsibleState } from 'vs/workbench/parts/views/browser/views'; +import { ViewsRegistry } from 'vs/workbench/parts/views/browser/views'; +import { ITreeViewDataProvider, ITreeItem, TreeItemCollapsibleState } from 'vs/workbench/parts/views/common/views'; export class MainThreadTreeViews extends MainThreadTreeViewsShape { diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index b168ae2ddac..8f6d2c8deb5 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -45,6 +45,8 @@ import { IPosition } from 'vs/editor/common/core/position'; import { IRange } from 'vs/editor/common/core/range'; import { ISelection, Selection } from 'vs/editor/common/core/selection'; +import { ITreeItem } from 'vs/workbench/parts/views/common/views'; + export interface IEnvironment { enableProposedApiForAll: boolean; enableProposedApiFor: string | string[]; @@ -194,14 +196,6 @@ export abstract class MainThreadEditorsShape { $getDiffInformation(id: string): TPromise { throw ni(); } } -export interface TreeItem extends vscode.TreeItem { - handle: number; - commandId?: string; - icon?: string; - iconDark?: string; - children?: TreeItem[]; -} - export abstract class MainThreadTreeViewsShape { $registerView(treeViewId: string): void { throw ni(); } $refresh(treeViewId: string, treeItemHandle?: number): void { throw ni(); } @@ -407,15 +401,9 @@ export abstract class ExtHostDocumentsAndEditorsShape { $acceptDocumentsAndEditorsDelta(delta: IDocumentsAndEditorsDelta): void { throw ni(); } } -export type TreeViewCommandArg = { - treeViewId: string, - treeItemHandle: number -}; - export abstract class ExtHostTreeViewsShape { - $getElements(treeViewId: string): TPromise { throw ni(); } - $getChildren(treeViewId: string, treeItemHandle: number): TPromise { throw ni(); } - $restore(treeViewId: string, treeItems: TreeItem[]): TPromise { throw ni(); } + $getElements(treeViewId: string): TPromise { throw ni(); } + $getChildren(treeViewId: string, treeItemHandle: number): TPromise { throw ni(); } } export abstract class ExtHostExtensionServiceShape { diff --git a/src/vs/workbench/api/node/extHostTreeViews.ts b/src/vs/workbench/api/node/extHostTreeViews.ts index f050ea1df7f..d94eabb4167 100644 --- a/src/vs/workbench/api/node/extHostTreeViews.ts +++ b/src/vs/workbench/api/node/extHostTreeViews.ts @@ -10,11 +10,11 @@ import URI from 'vs/base/common/uri'; import { TPromise } from 'vs/base/common/winjs.base'; import { Disposable } from 'vs/base/common/lifecycle'; import { IThreadService } from 'vs/workbench/services/thread/common/threadService'; -import { MainContext, ExtHostTreeViewsShape, MainThreadTreeViewsShape, TreeItem, TreeViewCommandArg } from './extHost.protocol'; +import { MainContext, ExtHostTreeViewsShape, MainThreadTreeViewsShape } from './extHost.protocol'; +import { ITreeItem, TreeViewItemHandleArg } from 'vs/workbench/parts/views/common/views'; import { TreeItemCollapsibleState } from './extHostTypes'; -import { ExtHostCommands } from 'vs/workbench/api/node/extHostCommands'; +import { ExtHostCommands, CommandsConverter } from 'vs/workbench/api/node/extHostCommands'; import { asWinJsPromise } from 'vs/base/common/async'; -import * as modes from 'vs/editor/common/modes'; type TreeItemHandle = number; @@ -31,7 +31,7 @@ export class ExtHostTreeViews extends ExtHostTreeViewsShape { this._proxy = threadService.get(MainContext.MainThreadTreeViews); commands.registerArgumentProcessor({ processArgument: arg => { - if (arg && arg.treeViewId && arg.treeItemHandle) { + if (arg && arg.$treeViewId && arg.$treeItemHandle) { return this.convertArgument(arg); } return arg; @@ -40,7 +40,7 @@ export class ExtHostTreeViews extends ExtHostTreeViewsShape { } registerTreeDataProvider(id: string, treeDataProvider: vscode.TreeDataProvider): vscode.Disposable { - const treeView = new ExtHostTreeView(id, treeDataProvider, this._proxy); + const treeView = new ExtHostTreeView(id, treeDataProvider, this._proxy, this.commands.converter); this.treeViews.set(id, treeView); return { dispose: () => { @@ -50,28 +50,25 @@ export class ExtHostTreeViews extends ExtHostTreeViewsShape { }; } - $getElements(treeViewId: string): TPromise { + $getElements(treeViewId: string): TPromise { const treeView = this.treeViews.get(treeViewId); if (!treeView) { - return TPromise.wrapError(localize('treeView.notRegistered', 'No tree view with id \'{0}\' registered.', treeViewId)); + return TPromise.wrapError(localize('treeView.notRegistered', 'No tree view with id \'{0}\' registered.', treeViewId)); } return treeView.getTreeItems(); } - $getChildren(treeViewId: string, treeItemHandle?: number): TPromise { + $getChildren(treeViewId: string, treeItemHandle?: number): TPromise { const treeView = this.treeViews.get(treeViewId); if (!treeView) { - return TPromise.wrapError(localize('treeView.notRegistered', 'No tree view with id \'{0}\' registered.', treeViewId)); + return TPromise.wrapError(localize('treeView.notRegistered', 'No tree view with id \'{0}\' registered.', treeViewId)); } return treeView.getChildren(treeItemHandle); } - private convertArgument(arg: TreeViewCommandArg): any { - const treeView = this.treeViews.get(arg.treeViewId); - if (!treeView) { - return TPromise.wrapError(localize('treeView.notRegistered', 'No tree view with id \'{0}\' registered.', arg.treeViewId)); - } - return treeView.getExtensionElement(arg.treeItemHandle); + private convertArgument(arg: TreeViewItemHandleArg): any { + const treeView = this.treeViews.get(arg.$treeViewId); + return treeView ? treeView.getExtensionElement(arg.$treeItemHandle) : null; } } @@ -83,7 +80,7 @@ class ExtHostTreeView extends Disposable { private itemHandlesMap: Map = new Map(); private extChildrenElementsMap: Map = new Map(); - constructor(private viewId: string, private dataProvider: vscode.TreeDataProvider, private proxy: MainThreadTreeViewsShape) { + constructor(private viewId: string, private dataProvider: vscode.TreeDataProvider, private proxy: MainThreadTreeViewsShape, private commands: CommandsConverter, ) { super(); this.proxy.$registerView(viewId); if (dataProvider.onDidChangeTreeData) { @@ -91,7 +88,7 @@ class ExtHostTreeView extends Disposable { } } - getTreeItems(): TPromise { + getTreeItems(): TPromise { this.extChildrenElementsMap.clear(); this.extElementsMap.clear(); this.itemHandlesMap.clear(); @@ -100,12 +97,12 @@ class ExtHostTreeView extends Disposable { .then(elements => this.processAndMapElements(elements)); } - getChildren(treeItemHandle: TreeItemHandle): TPromise { + getChildren(treeItemHandle: TreeItemHandle): TPromise { let extElement = this.getExtensionElement(treeItemHandle); if (extElement) { this.clearChildren(extElement); } else { - return TPromise.wrapError(localize('treeItem.notFound', 'No tree item with id \'{0}\' found.', treeItemHandle)); + return TPromise.wrapError(localize('treeItem.notFound', 'No tree item with id \'{0}\' found.', treeItemHandle)); } return asWinJsPromise(() => this.dataProvider.getChildren(extElement)) @@ -127,12 +124,12 @@ class ExtHostTreeView extends Disposable { } } - private processAndMapElements(elements: T[]): TPromise { - const treeItemsPromises: TPromise[] = []; + private processAndMapElements(elements: T[]): TPromise { + const treeItemsPromises: TPromise[] = []; for (const element of elements) { if (element) { if (this.extChildrenElementsMap.has(element)) { - return TPromise.wrapError(localize('treeView.duplicateElement', 'Element {0} is already registered', element)); + return TPromise.wrapError(localize('treeView.duplicateElement', 'Element {0} is already registered', element)); } const treeItem = this.massageTreeItem(this.dataProvider.getTreeItem(element)); if (treeItem) { @@ -152,7 +149,7 @@ class ExtHostTreeView extends Disposable { return TPromise.join(treeItemsPromises); } - private massageTreeItem(extensionTreeItem: vscode.TreeItem): TreeItem { + private massageTreeItem(extensionTreeItem: vscode.TreeItem): ITreeItem { if (!extensionTreeItem) { return null; } @@ -160,7 +157,7 @@ class ExtHostTreeView extends Disposable { return { handle: ++this._itemHandlePool, label: extensionTreeItem.label, - commandId: extensionTreeItem.command ? extensionTreeItem.command.command : void 0, + command: extensionTreeItem.command ? this.commands.toInternal(extensionTreeItem.command) : void 0, contextValue: extensionTreeItem.contextValue, icon, iconDark: this.getDarkIconPath(extensionTreeItem) || icon, diff --git a/src/vs/workbench/parts/views/browser/treeView.ts b/src/vs/workbench/parts/views/browser/treeView.ts index d642e54a3a7..fd8a1387fce 100644 --- a/src/vs/workbench/parts/views/browser/treeView.ts +++ b/src/vs/workbench/parts/views/browser/treeView.ts @@ -26,7 +26,8 @@ import { IProgressService } from 'vs/platform/progress/common/progress'; import { ITree, IDataSource, IRenderer, ContextMenuEvent } from 'vs/base/parts/tree/browser/tree'; import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey'; import { ActionItem } from 'vs/base/browser/ui/actionbar/actionbar'; -import { ViewsRegistry, ITreeViewDataProvider, IViewOptions, ITreeItem, TreeItemCollapsibleState } from 'vs/workbench/parts/views/browser/views'; +import { ViewsRegistry, IViewOptions } from 'vs/workbench/parts/views/browser/views'; +import { ITreeViewDataProvider, ITreeItem, TreeItemCollapsibleState, TreeViewItemHandleArg } from 'vs/workbench/parts/views/common/views'; import { IExtensionService } from 'vs/platform/extensions/common/extensions'; import { CollapsibleState } from 'vs/base/browser/ui/splitview/splitview'; import { ICommandService } from 'vs/platform/commands/common/commands'; @@ -170,8 +171,8 @@ export class TreeView extends CollapsibleViewletView { private onSelection(): void { const selection: ITreeItem = this.tree.getSelection()[0]; if (selection) { - if (selection.commandId) { - this.commandService.executeCommand(selection.commandId, { treeViewId: this.id, treeItemHandle: selection.handle }); + if (selection.command) { + this.commandService.executeCommand(selection.command.id, ...(selection.command.arguments || [])); } } } @@ -338,7 +339,7 @@ class TreeController extends DefaultController { } }, - getActionsContext: () => ({ treeViewId: this.treeViewId, treeItemHandle: node.handle }), + getActionsContext: () => ({ $treeViewId: this.treeViewId, $treeItemHandle: node.handle }), actionRunner: new MultipleSelectionActionRunner(() => tree.getSelection()) }); diff --git a/src/vs/workbench/parts/views/browser/views.ts b/src/vs/workbench/parts/views/browser/views.ts index d5a69e9827d..7aa26d2466b 100644 --- a/src/vs/workbench/parts/views/browser/views.ts +++ b/src/vs/workbench/parts/views/browser/views.ts @@ -3,10 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { TPromise } from 'vs/base/common/winjs.base'; import Event, { Emitter } from 'vs/base/common/event'; import { IActionRunner } from 'vs/base/common/actions'; import { IViewletView as IView } from 'vs/workbench/browser/viewlet'; +import { ITreeViewDataProvider } from 'vs/workbench/parts/views/common/views'; export class ViewLocation { @@ -20,12 +20,6 @@ export class ViewLocation { } } -export enum TreeItemCollapsibleState { - None = 0, - Collapsed = 1, - Expanded = 2 -} - export interface IViewOptions { name: string; actionRunner: IActionRunner; @@ -52,35 +46,6 @@ export interface IViewDescriptor { } -export interface ITreeItem { - - handle: number; - - label: string; - - icon?: string; - - iconDark?: string; - - contextValue?: string; - - commandId?: string; - - children?: ITreeItem[]; - - collapsibleState?: TreeItemCollapsibleState; -} - -export interface ITreeViewDataProvider { - - onDidChange: Event; - - getElements(): TPromise; - - getChildren(element: ITreeItem): TPromise; - -} - export interface IViewsRegistry { readonly onViewsRegistered: Event; diff --git a/src/vs/workbench/parts/views/common/views.ts b/src/vs/workbench/parts/views/common/views.ts new file mode 100644 index 00000000000..22eac5bfe1b --- /dev/null +++ b/src/vs/workbench/parts/views/common/views.ts @@ -0,0 +1,48 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { TPromise } from 'vs/base/common/winjs.base'; +import Event from 'vs/base/common/event'; +import { Command } from 'vs/editor/common/modes'; + +export type TreeViewItemHandleArg = { + $treeViewId: string, + $treeItemHandle: number +}; + +export enum TreeItemCollapsibleState { + None = 0, + Collapsed = 1, + Expanded = 2 +} + +export interface ITreeItem { + + handle: number; + + label: string; + + icon?: string; + + iconDark?: string; + + contextValue?: string; + + command?: Command; + + children?: ITreeItem[]; + + collapsibleState?: TreeItemCollapsibleState; +} + +export interface ITreeViewDataProvider { + + onDidChange: Event; + + getElements(): TPromise; + + getChildren(element: ITreeItem): TPromise; + +} \ No newline at end of file