mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-02-16 18:46:40 -05:00
Added node selectdEvent (#2153)
* Added model view tree node selectedEvent
This commit is contained in:
@@ -100,7 +100,7 @@
|
|||||||
"sqlops": "github:anthonydresser/sqlops-extension-sqlops",
|
"sqlops": "github:anthonydresser/sqlops-extension-sqlops",
|
||||||
"tslint": "^3.14.0",
|
"tslint": "^3.14.0",
|
||||||
"typescript": "^2.6.1",
|
"typescript": "^2.6.1",
|
||||||
"vscode": "^1.1.14",
|
"vscode": "^1.1.18",
|
||||||
"@types/handlebars": "^4.0.11",
|
"@types/handlebars": "^4.0.11",
|
||||||
"vsce": "1.36.2"
|
"vsce": "1.36.2"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -114,7 +114,17 @@ export default class MainController implements vscode.Disposable {
|
|||||||
let tree: sqlops.TreeComponent<TreeNode> = view.modelBuilder.tree<TreeNode>().withProperties({
|
let tree: sqlops.TreeComponent<TreeNode> = view.modelBuilder.tree<TreeNode>().withProperties({
|
||||||
'withCheckbox': true
|
'withCheckbox': true
|
||||||
}).component();
|
}).component();
|
||||||
tree.registerDataProvider(treeDataProvider);
|
let treeView = tree.registerDataProvider(treeDataProvider);
|
||||||
|
treeView.onNodeCheckedChanged(item => {
|
||||||
|
if (item && item.element) {
|
||||||
|
item.element.changeNodeCheckedState(item.checked);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
treeView.onDidChangeSelection(selectedNodes => {
|
||||||
|
selectedNodes.forEach(node => {
|
||||||
|
console.info('tree node selected: ' + node.label);
|
||||||
|
});
|
||||||
|
});
|
||||||
let formModel = view.modelBuilder.formContainer()
|
let formModel = view.modelBuilder.formContainer()
|
||||||
.withFormItems([{
|
.withFormItems([{
|
||||||
component: tree,
|
component: tree,
|
||||||
@@ -150,7 +160,7 @@ export default class MainController implements vscode.Disposable {
|
|||||||
})
|
})
|
||||||
.component();
|
.component();
|
||||||
checkbox.onChanged(e => {
|
checkbox.onChanged(e => {
|
||||||
console.info("inputBox.enabled " + inputBox.enabled);
|
console.info('inputBox.enabled ' + inputBox.enabled);
|
||||||
inputBox.enabled = !inputBox.enabled;
|
inputBox.enabled = !inputBox.enabled;
|
||||||
});
|
});
|
||||||
let button = view.modelBuilder.button()
|
let button = view.modelBuilder.button()
|
||||||
|
|||||||
@@ -291,9 +291,4 @@ export class TreeDataProvider implements sqlops.TreeComponentDataProvider<TreeNo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
onNodeCheckedChanged(element: TreeNode, checked: boolean): void {
|
|
||||||
if (element) {
|
|
||||||
element.changeNodeCheckedState(checked);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -92,7 +92,7 @@ export default class TreeComponent extends ComponentBase implements IComponent,
|
|||||||
private createTreeControl(): void {
|
private createTreeControl(): void {
|
||||||
if (!this._tree && this._dataProvider) {
|
if (!this._tree && this._dataProvider) {
|
||||||
const dataSource = this._instantiationService.createInstance(TreeComponentDataSource, this._dataProvider);
|
const dataSource = this._instantiationService.createInstance(TreeComponentDataSource, this._dataProvider);
|
||||||
const renderer = this._instantiationService.createInstance(TreeComponentRenderer, this.themeService, { withCheckbox: this.withCheckbox });
|
const renderer = this._instantiationService.createInstance(TreeComponentRenderer, this._dataProvider, this.themeService, { withCheckbox: this.withCheckbox });
|
||||||
this._treeRenderer = renderer;
|
this._treeRenderer = renderer;
|
||||||
const controller = new DefaultController();
|
const controller = new DefaultController();
|
||||||
const filter = new DefaultFilter();
|
const filter = new DefaultFilter();
|
||||||
@@ -111,6 +111,9 @@ export default class TreeComponent extends ComponentBase implements IComponent,
|
|||||||
this._tree.domFocus();
|
this._tree.domFocus();
|
||||||
this._register(this._tree);
|
this._register(this._tree);
|
||||||
this._register(attachListStyler(this._tree, this.themeService));
|
this._register(attachListStyler(this._tree, this.themeService));
|
||||||
|
this._register(this._tree.onDidChangeSelection( e => {
|
||||||
|
this._dataProvider.onNodeSelected(e.selection);
|
||||||
|
}));
|
||||||
this._tree.refresh();
|
this._tree.refresh();
|
||||||
this.layout();
|
this.layout();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import { Disposable } from 'vs/base/common/lifecycle';
|
|||||||
import { Event, Emitter } from 'vs/base/common/event';
|
import { Event, Emitter } from 'vs/base/common/event';
|
||||||
import { ITreeComponentItem } from 'sql/workbench/common/views';
|
import { ITreeComponentItem } from 'sql/workbench/common/views';
|
||||||
import { IWorkbenchThemeService } from 'vs/workbench/services/themes/common/workbenchThemeService';
|
import { IWorkbenchThemeService } from 'vs/workbench/services/themes/common/workbenchThemeService';
|
||||||
|
import { TreeViewDataProvider } from './treeViewDataProvider';
|
||||||
|
|
||||||
export enum TreeCheckboxState {
|
export enum TreeCheckboxState {
|
||||||
Intermediate = 0,
|
Intermediate = 0,
|
||||||
@@ -90,6 +91,7 @@ export class TreeComponentRenderer extends Disposable implements IRenderer {
|
|||||||
|
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
|
private _dataProvider: TreeViewDataProvider,
|
||||||
private themeService: IWorkbenchThemeService,
|
private themeService: IWorkbenchThemeService,
|
||||||
public options?: { withCheckbox: boolean }
|
public options?: { withCheckbox: boolean }
|
||||||
) {
|
) {
|
||||||
@@ -137,7 +139,10 @@ export class TreeComponentRenderer extends Disposable implements IRenderer {
|
|||||||
const icon = this.themeService.getTheme().type === LIGHT ? element.icon : element.iconDark;
|
const icon = this.themeService.getTheme().type === LIGHT ? element.icon : element.iconDark;
|
||||||
templateData.icon.style.backgroundImage = icon ? `url('${icon}')` : '';
|
templateData.icon.style.backgroundImage = icon ? `url('${icon}')` : '';
|
||||||
dom.toggleClass(templateData.icon, 'model-view-tree-node-item-icon', !!icon);
|
dom.toggleClass(templateData.icon, 'model-view-tree-node-item-icon', !!icon);
|
||||||
if (element && !templateData.model) {
|
if (element) {
|
||||||
|
element.onCheckedChanged = (checked: boolean) => {
|
||||||
|
this._dataProvider.onNodeCheckedChanged(element.handle, checked);
|
||||||
|
}
|
||||||
templateData.model = element;
|
templateData.model = element;
|
||||||
}
|
}
|
||||||
if (templateId === TreeComponentRenderer.DEFAULT_TEMPLATE) {
|
if (templateId === TreeComponentRenderer.DEFAULT_TEMPLATE) {
|
||||||
|
|||||||
@@ -19,21 +19,13 @@ export class TreeViewDataProvider extends vsTreeView.TreeViewDataProvider implem
|
|||||||
super(`${handle}-${treeViewId}`, context.getProxy(SqlExtHostContext.ExtHostModelViewTreeViews), notificationService);
|
super(`${handle}-${treeViewId}`, context.getProxy(SqlExtHostContext.ExtHostModelViewTreeViews), notificationService);
|
||||||
}
|
}
|
||||||
|
|
||||||
onNodeCheckedChanged(treeViewId: string, treeItemHandle?: string, checked?: boolean) {
|
onNodeCheckedChanged(treeItemHandle?: string, checked?: boolean) {
|
||||||
(<ExtHostModelViewTreeViewsShape>this._proxy).$onNodeCheckedChanged(treeViewId, treeItemHandle, checked);
|
(<ExtHostModelViewTreeViewsShape>this._proxy).$onNodeCheckedChanged(this.treeViewId, treeItemHandle, checked);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected postGetChildren(elements: ITreeComponentItem[]): ITreeComponentItem[] {
|
onNodeSelected(items: ITreeComponentItem[]) {
|
||||||
const result = [];
|
if (items) {
|
||||||
if (elements) {
|
(<ExtHostModelViewTreeViewsShape>this._proxy).$onNodeSelected(this.treeViewId, items.map(i => i.handle));
|
||||||
for (const element of elements) {
|
|
||||||
element.onCheckedChanged = (checked: boolean) => {
|
|
||||||
this.onNodeCheckedChanged(this.treeViewId, element.handle, checked);
|
|
||||||
};
|
|
||||||
this.itemsMap.set(element.handle, element);
|
|
||||||
result.push(element);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
13
src/sql/sqlops.proposed.d.ts
vendored
13
src/sql/sqlops.proposed.d.ts
vendored
@@ -42,10 +42,17 @@ declare module 'sqlops' {
|
|||||||
|
|
||||||
export interface TreeComponentDataProvider<T> extends vscode.TreeDataProvider<T> {
|
export interface TreeComponentDataProvider<T> extends vscode.TreeDataProvider<T> {
|
||||||
getTreeItem(element: T): TreeComponentItem | Thenable<TreeComponentItem>;
|
getTreeItem(element: T): TreeComponentItem | Thenable<TreeComponentItem>;
|
||||||
|
|
||||||
onNodeCheckedChanged?(element: T, checked: boolean): void;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface NodeCheckedEventParameters<T> {
|
||||||
|
element: T,
|
||||||
|
checked: boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface TreeComponentView<T> extends vscode.Disposable {
|
||||||
|
onNodeCheckedChanged: vscode.Event<NodeCheckedEventParameters<T>>;
|
||||||
|
onDidChangeSelection: vscode.Event<T[]>;
|
||||||
|
}
|
||||||
|
|
||||||
export class TreeComponentItem extends vscode.TreeItem {
|
export class TreeComponentItem extends vscode.TreeItem {
|
||||||
checked?: boolean;
|
checked?: boolean;
|
||||||
@@ -531,7 +538,7 @@ declare module 'sqlops' {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export interface TreeComponent<T> extends Component, TreeProperties {
|
export interface TreeComponent<T> extends Component, TreeProperties {
|
||||||
registerDataProvider<T>(dataProvider: TreeComponentDataProvider<T>): any;
|
registerDataProvider<T>(dataProvider: TreeComponentDataProvider<T>): TreeComponentView<T>;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface WebViewComponent extends Component {
|
export interface WebViewComponent extends Component {
|
||||||
|
|||||||
@@ -1063,7 +1063,7 @@ class TreeComponentWrapper<T> extends ComponentWrapper implements sqlops.TreeCom
|
|||||||
this.properties = {};
|
this.properties = {};
|
||||||
}
|
}
|
||||||
|
|
||||||
public registerDataProvider<T>(dataProvider: sqlops.TreeComponentDataProvider<T>): vscode.TreeView<T> {
|
public registerDataProvider<T>(dataProvider: sqlops.TreeComponentDataProvider<T>): sqlops.TreeComponentView<T> {
|
||||||
this.setDataProvider();
|
this.setDataProvider();
|
||||||
return this._extHostModelViewTree.$createTreeView(this._handle, this.id, { treeDataProvider: dataProvider });
|
return this._extHostModelViewTree.$createTreeView(this._handle, this.id, { treeDataProvider: dataProvider });
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,33 +14,32 @@ import { asWinJsPromise } from 'vs/base/common/async';
|
|||||||
import { IMainContext } from 'vs/workbench/api/node/extHost.protocol';
|
import { IMainContext } from 'vs/workbench/api/node/extHost.protocol';
|
||||||
import * as sqlops from 'sqlops';
|
import * as sqlops from 'sqlops';
|
||||||
import * as vsTreeExt from 'vs/workbench/api/node/extHostTreeViews';
|
import * as vsTreeExt from 'vs/workbench/api/node/extHostTreeViews';
|
||||||
|
import { Emitter } from 'vs/base/common/event';
|
||||||
|
|
||||||
export class ExtHostModelViewTreeViews implements ExtHostModelViewTreeViewsShape {
|
export class ExtHostModelViewTreeViews implements ExtHostModelViewTreeViewsShape {
|
||||||
private _proxy: MainThreadModelViewShape;
|
private _proxy: MainThreadModelViewShape;
|
||||||
|
|
||||||
private treeViews: Map<string, ExtHostTreeView<any>> = new Map<string, ExtHostTreeView<any>>();
|
private treeViews: Map<string, ExtHostTreeView<any>> = new Map<string, ExtHostTreeView<any>>();
|
||||||
|
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private _mainContext: IMainContext
|
private _mainContext: IMainContext
|
||||||
) {
|
) {
|
||||||
this._proxy = this._mainContext.getProxy(SqlMainContext.MainThreadModelView);
|
this._proxy = this._mainContext.getProxy(SqlMainContext.MainThreadModelView);
|
||||||
}
|
}
|
||||||
|
|
||||||
$createTreeView<T>(handle: number, componentId: string, options: { treeDataProvider: sqlops.TreeComponentDataProvider<T> }): vscode.TreeView<T> {
|
$createTreeView<T>(handle: number, componentId: string, options: { treeDataProvider: sqlops.TreeComponentDataProvider<T> }): sqlops.TreeComponentView<T> {
|
||||||
if (!options || !options.treeDataProvider) {
|
if (!options || !options.treeDataProvider) {
|
||||||
throw new Error('Options with treeDataProvider is mandatory');
|
throw new Error('Options with treeDataProvider is mandatory');
|
||||||
}
|
}
|
||||||
|
|
||||||
const treeView = this.createExtHostTreeViewer(handle, componentId, options.treeDataProvider);
|
const treeView = this.createExtHostTreeViewer(handle, componentId, options.treeDataProvider);
|
||||||
return {
|
return {
|
||||||
reveal: (element: T, options?: { select?: boolean }): Thenable<void> => {
|
|
||||||
return treeView.reveal(element, options);
|
|
||||||
},
|
|
||||||
dispose: () => {
|
dispose: () => {
|
||||||
this.treeViews.delete(componentId);
|
this.treeViews.delete(componentId);
|
||||||
treeView.dispose();
|
treeView.dispose();
|
||||||
}
|
},
|
||||||
|
onNodeCheckedChanged: treeView.NodeCheckedChanged,
|
||||||
|
onDidChangeSelection: treeView.ChangeSelection
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -60,6 +59,13 @@ export class ExtHostModelViewTreeViews implements ExtHostModelViewTreeViewsShape
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$onNodeSelected(treeViewId: string, handles: string[]): void {
|
||||||
|
const treeView = this.treeViews.get(treeViewId);
|
||||||
|
if (treeView) {
|
||||||
|
treeView.onNodeSelectedChanged(handles);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private createExtHostTreeViewer<T>(handle: number, id: string, dataProvider: sqlops.TreeComponentDataProvider<T>): ExtHostTreeView<T> {
|
private createExtHostTreeViewer<T>(handle: number, id: string, dataProvider: sqlops.TreeComponentDataProvider<T>): ExtHostTreeView<T> {
|
||||||
const treeView = new ExtHostTreeView<T>(handle, id, dataProvider, this._proxy, undefined);
|
const treeView = new ExtHostTreeView<T>(handle, id, dataProvider, this._proxy, undefined);
|
||||||
this.treeViews.set(`${handle}-${id}`, treeView);
|
this.treeViews.set(`${handle}-${id}`, treeView);
|
||||||
@@ -69,6 +75,10 @@ export class ExtHostModelViewTreeViews implements ExtHostModelViewTreeViewsShape
|
|||||||
|
|
||||||
export class ExtHostTreeView<T> extends vsTreeExt.ExtHostTreeView<T> {
|
export class ExtHostTreeView<T> extends vsTreeExt.ExtHostTreeView<T> {
|
||||||
|
|
||||||
|
private _onNodeCheckedChanged = new Emitter<sqlops.NodeCheckedEventParameters<T>>();
|
||||||
|
private _onDidChangeSelection = new Emitter<T[]>();
|
||||||
|
public readonly NodeCheckedChanged: vscode.Event<sqlops.NodeCheckedEventParameters<T>> = this._onNodeCheckedChanged.event;
|
||||||
|
public readonly ChangeSelection: vscode.Event<T[]> = this._onDidChangeSelection.event;
|
||||||
constructor(private handle: number, private componentId: string, private componentDataProvider: sqlops.TreeComponentDataProvider<T>, private modelViewProxy: MainThreadModelViewShape, commands: CommandsConverter) {
|
constructor(private handle: number, private componentId: string, private componentDataProvider: sqlops.TreeComponentDataProvider<T>, private modelViewProxy: MainThreadModelViewShape, commands: CommandsConverter) {
|
||||||
super(componentId, componentDataProvider, undefined, commands);
|
super(componentId, componentDataProvider, undefined, commands);
|
||||||
}
|
}
|
||||||
@@ -79,7 +89,16 @@ export class ExtHostTreeView<T> extends vsTreeExt.ExtHostTreeView<T> {
|
|||||||
console.error(`No tree item with id \'${parentHandle}\' found.`);
|
console.error(`No tree item with id \'${parentHandle}\' found.`);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.componentDataProvider.onNodeCheckedChanged(parentElement, checked);
|
this._onNodeCheckedChanged.fire({element: parentElement, checked: checked});
|
||||||
|
}
|
||||||
|
|
||||||
|
onNodeSelectedChanged(parentHandles?: vsTreeExt.TreeItemHandle[]): void {
|
||||||
|
if (parentHandles) {
|
||||||
|
let nodes = parentHandles.map(parentHandle => {
|
||||||
|
return parentHandle ? this.getExtensionElement(parentHandle) : void 0;
|
||||||
|
});
|
||||||
|
this._onDidChangeSelection.fire(nodes);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
reveal(element: T, options?: { select?: boolean }): TPromise<void> {
|
reveal(element: T, options?: { select?: boolean }): TPromise<void> {
|
||||||
|
|||||||
@@ -604,8 +604,9 @@ export interface ExtHostModelViewShape {
|
|||||||
|
|
||||||
export interface ExtHostModelViewTreeViewsShape {
|
export interface ExtHostModelViewTreeViewsShape {
|
||||||
$getChildren(treeViewId: string, treeItemHandle?: string): TPromise<ITreeComponentItem[]>;
|
$getChildren(treeViewId: string, treeItemHandle?: string): TPromise<ITreeComponentItem[]>;
|
||||||
$createTreeView(handle: number, componentId: string, options: { treeDataProvider: vscode.TreeDataProvider<any> }): vscode.TreeView<any>;
|
$createTreeView(handle: number, componentId: string, options: { treeDataProvider: vscode.TreeDataProvider<any> }): sqlops.TreeComponentView<any>;
|
||||||
$onNodeCheckedChanged(treeViewId: string, treeItemHandle?: string, checked?: boolean): void;
|
$onNodeCheckedChanged(treeViewId: string, treeItemHandle?: string, checked?: boolean): void;
|
||||||
|
$onNodeSelected(treeViewId: string, nodes: string[]): void;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface ExtHostBackgroundTaskManagementShape {
|
export interface ExtHostBackgroundTaskManagementShape {
|
||||||
|
|||||||
@@ -125,8 +125,7 @@ export class TreeViewDataProvider implements ITreeViewDataProvider {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// {{SQL CARBON EDIT}}
|
private postGetChildren(elements: ITreeItem[]): ITreeItem[] {
|
||||||
protected postGetChildren(elements: ITreeItem[]): ITreeItem[] {
|
|
||||||
const result = [];
|
const result = [];
|
||||||
if (elements) {
|
if (elements) {
|
||||||
for (const element of elements) {
|
for (const element of elements) {
|
||||||
|
|||||||
Reference in New Issue
Block a user