handle keyboard selection (#13175)

This commit is contained in:
Alan Ren
2020-10-30 21:17:49 -07:00
committed by GitHub
parent d7767c7d91
commit cb1c8503b0
2 changed files with 42 additions and 34 deletions

View File

@@ -10,7 +10,7 @@ import { IConnectionTreeDescriptor, IConnectionTreeService } from 'sql/workbench
import * as DOM from 'vs/base/browser/dom'; import * as DOM from 'vs/base/browser/dom';
import { IIdentityProvider, IListVirtualDelegate } from 'vs/base/browser/ui/list/list'; import { IIdentityProvider, IListVirtualDelegate } from 'vs/base/browser/ui/list/list';
import { IListAccessibilityProvider } from 'vs/base/browser/ui/list/listWidget'; import { IListAccessibilityProvider } from 'vs/base/browser/ui/list/listWidget';
import { IAsyncDataSource, ITreeMouseEvent, ITreeNode, ITreeRenderer } from 'vs/base/browser/ui/tree/tree'; import { IAsyncDataSource, ITreeNode, ITreeRenderer } from 'vs/base/browser/ui/tree/tree';
import { Iterable } from 'vs/base/common/iterator'; import { Iterable } from 'vs/base/common/iterator';
import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; import { Disposable, IDisposable } from 'vs/base/common/lifecycle';
import { basename, dirname } from 'vs/base/common/resources'; import { basename, dirname } from 'vs/base/common/resources';
@@ -46,6 +46,7 @@ import { IContextKey, IContextKeyService, RawContextKey } from 'vs/platform/cont
import { IAction } from 'vs/base/common/actions'; import { IAction } from 'vs/base/common/actions';
import { createAndFillInContextMenuActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; import { createAndFillInContextMenuActions } from 'vs/platform/actions/browser/menuEntryActionViewItem';
import { ICapabilitiesService } from 'sql/platform/capabilities/common/capabilitiesService'; import { ICapabilitiesService } from 'sql/platform/capabilities/common/capabilitiesService';
import { IConnectionProfile } from 'azdata';
export type TreeElement = ConnectionDialogTreeProviderElement | ITreeItemFromProvider | SavedConnectionNode | ServerTreeElement; export type TreeElement = ConnectionDialogTreeProviderElement | ITreeItemFromProvider | SavedConnectionNode | ServerTreeElement;
@@ -56,6 +57,11 @@ export class ConnectionBrowseTab implements IPanelTab {
constructor(@IInstantiationService private readonly instantiationService: IInstantiationService) { } constructor(@IInstantiationService private readonly instantiationService: IInstantiationService) { }
} }
export interface SelectedConnectionChangedEventArgs {
connectionProfile: IConnectionProfile,
connect: boolean
}
export class ConnectionBrowserView extends Disposable implements IPanelView { export class ConnectionBrowserView extends Disposable implements IPanelView {
private tree: WorkbenchAsyncDataTree<TreeModel, TreeElement> | undefined; private tree: WorkbenchAsyncDataTree<TreeModel, TreeElement> | undefined;
private filterInput: InputBox | undefined; private filterInput: InputBox | undefined;
@@ -67,11 +73,8 @@ export class ConnectionBrowserView extends Disposable implements IPanelView {
public onDidChangeVisibility = Event.None; public onDidChangeVisibility = Event.None;
private readonly _onSelect = this._register(new Emitter<ITreeMouseEvent<TreeElement>>()); private readonly _onSelectedConnectionChanged = this._register(new Emitter<SelectedConnectionChangedEventArgs>());
public readonly onSelect = this._onSelect.event; public readonly onSelectedConnectionChanged = this._onSelectedConnectionChanged.event;
private readonly _onDblClick = this._register(new Emitter<ITreeMouseEvent<TreeElement>>());
public readonly onDblClick = this._onDblClick.event;
constructor( constructor(
@IInstantiationService private readonly instantiationService: IInstantiationService, @IInstantiationService private readonly instantiationService: IInstantiationService,
@@ -180,19 +183,12 @@ export class ConnectionBrowserView extends Disposable implements IPanelView {
}); });
} }
})); }));
this._register(this.tree.onMouseDblClick(e => this._onDblClick.fire(e))); this._register(this.tree.onMouseDblClick(e => {
this._register(this.tree.onMouseClick(e => this._onSelect.fire(e))); this.handleTreeElementSelection(e?.element, true);
}));
this._register(this.tree.onDidOpen((e) => { this._register(this.tree.onDidOpen((e) => {
if (!e.browserEvent) { this.handleTreeElementSelection(e?.element, false);
return;
}
const selection = this.tree.getSelection();
if (selection.length === 1) {
const selectedNode = selection[0];
if ('element' in selectedNode && selectedNode.element.command) {
this.commandService.executeCommand(selectedNode.element.command.id, ...(selectedNode.element.command.arguments || []));
}
}
})); }));
this.tree.setInput(this.model); this.tree.setInput(this.model);
@@ -221,6 +217,30 @@ export class ConnectionBrowserView extends Disposable implements IPanelView {
})); }));
} }
private handleTreeElementSelection(selectedNode: TreeElement, connect: boolean): void {
if (!selectedNode) {
return;
}
if ('element' in selectedNode) {
if (selectedNode.element.command) {
this.commandService.executeCommand(selectedNode.element.command.id, ...(selectedNode.element.command.arguments || []));
} else {
if (selectedNode.element.payload) {
this._onSelectedConnectionChanged.fire(
{
connectionProfile: selectedNode.element.payload,
connect: connect
});
}
}
} else if (selectedNode instanceof ConnectionProfile) {
this._onSelectedConnectionChanged.fire({
connectionProfile: selectedNode,
connect: connect
});
}
}
private updateSavedConnectionsNode(): void { private updateSavedConnectionsNode(): void {
if (this.model.savedConnectionNode) { if (this.model.savedConnectionNode) {
this.tree.updateChildren(this.model.savedConnectionNode); this.tree.updateChildren(this.model.savedConnectionNode);

View File

@@ -43,7 +43,7 @@ import { ClearRecentConnectionsAction } from 'sql/workbench/services/connection/
import { ITree } from 'vs/base/parts/tree/browser/tree'; import { ITree } from 'vs/base/parts/tree/browser/tree';
import { AsyncServerTree } from 'sql/workbench/services/objectExplorer/browser/asyncServerTree'; import { AsyncServerTree } from 'sql/workbench/services/objectExplorer/browser/asyncServerTree';
import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
import { ConnectionBrowseTab, ITreeItemFromProvider } from 'sql/workbench/services/connection/browser/connectionBrowseTab'; import { ConnectionBrowseTab } from 'sql/workbench/services/connection/browser/connectionBrowseTab';
export interface OnShowUIResponse { export interface OnShowUIResponse {
selectedProviderDisplayName: string; selectedProviderDisplayName: string;
@@ -265,21 +265,9 @@ export class ConnectionDialogWidget extends Modal {
this.browsePanel = new ConnectionBrowseTab(this.instantiationService); this.browsePanel = new ConnectionBrowseTab(this.instantiationService);
this.browsePanel.view.onSelect(e => { this._register(this.browsePanel.view.onSelectedConnectionChanged(e => {
if (e.element instanceof ConnectionProfile) { this.onConnectionClick(e.connectionProfile, e.connect);
this.onConnectionClick(e.element); }));
} else if ((e.element as ITreeItemFromProvider)?.element?.payload) {
this.onConnectionClick((e.element as ITreeItemFromProvider).element.payload);
}
});
this.browsePanel.view.onDblClick(e => {
if (e.element instanceof ConnectionProfile) {
this.onConnectionClick(e.element, true);
} else if ((e.element as ITreeItemFromProvider)?.element?.payload) {
this.onConnectionClick((e.element as ITreeItemFromProvider).element.payload, true);
}
});
if (this._configurationService.getValue<boolean>('workbench.enablePreviewFeatures')) { if (this._configurationService.getValue<boolean>('workbench.enablePreviewFeatures')) {
this._panel.pushTab(this.browsePanel); this._panel.pushTab(this.browsePanel);