From 9117b02c72a59550b4df4df681a0f4cb08e1f85a Mon Sep 17 00:00:00 2001 From: Udeesha Gautam <46980425+udeeshagautam@users.noreply.github.com> Date: Tue, 20 Aug 2019 11:40:16 -0700 Subject: [PATCH] Feature/sqlcmd - ADS changes to enable SQLCMD (#6555) * Basic SQLCMD functionality to run query and toggle mode * icons and some cleanup * Adding PR comments --- .../ui/taskbar/media/disable_sqlcmd.svg | 12 ++++ .../taskbar/media/disable_sqlcmd_inverse.svg | 12 ++++ .../ui/taskbar/media/enable_sqlcmd.svg | 12 ++++ .../taskbar/media/enable_sqlcmd_inverse.svg | 12 ++++ .../base/browser/ui/taskbar/media/icons.css | 20 +++++++ .../parts/query/browser/queryActions.ts | 58 ++++++++++++++++++- .../parts/query/browser/queryEditor.ts | 11 +++- .../parts/query/common/queryInput.ts | 13 +++++ 8 files changed, 147 insertions(+), 3 deletions(-) create mode 100644 src/sql/base/browser/ui/taskbar/media/disable_sqlcmd.svg create mode 100644 src/sql/base/browser/ui/taskbar/media/disable_sqlcmd_inverse.svg create mode 100644 src/sql/base/browser/ui/taskbar/media/enable_sqlcmd.svg create mode 100644 src/sql/base/browser/ui/taskbar/media/enable_sqlcmd_inverse.svg diff --git a/src/sql/base/browser/ui/taskbar/media/disable_sqlcmd.svg b/src/sql/base/browser/ui/taskbar/media/disable_sqlcmd.svg new file mode 100644 index 0000000000..b85569a9d4 --- /dev/null +++ b/src/sql/base/browser/ui/taskbar/media/disable_sqlcmd.svg @@ -0,0 +1,12 @@ + + ADS_SQLCMD_Mode + + + + + + + + + + diff --git a/src/sql/base/browser/ui/taskbar/media/disable_sqlcmd_inverse.svg b/src/sql/base/browser/ui/taskbar/media/disable_sqlcmd_inverse.svg new file mode 100644 index 0000000000..b85569a9d4 --- /dev/null +++ b/src/sql/base/browser/ui/taskbar/media/disable_sqlcmd_inverse.svg @@ -0,0 +1,12 @@ + + ADS_SQLCMD_Mode + + + + + + + + + + diff --git a/src/sql/base/browser/ui/taskbar/media/enable_sqlcmd.svg b/src/sql/base/browser/ui/taskbar/media/enable_sqlcmd.svg new file mode 100644 index 0000000000..ce5bf3817d --- /dev/null +++ b/src/sql/base/browser/ui/taskbar/media/enable_sqlcmd.svg @@ -0,0 +1,12 @@ + + ADS_SQLCMD_Mode + + + + + + + + + + diff --git a/src/sql/base/browser/ui/taskbar/media/enable_sqlcmd_inverse.svg b/src/sql/base/browser/ui/taskbar/media/enable_sqlcmd_inverse.svg new file mode 100644 index 0000000000..d8b694eeec --- /dev/null +++ b/src/sql/base/browser/ui/taskbar/media/enable_sqlcmd_inverse.svg @@ -0,0 +1,12 @@ + + ADS_SQLCMD_Mode + + + + + + + + + + diff --git a/src/sql/base/browser/ui/taskbar/media/icons.css b/src/sql/base/browser/ui/taskbar/media/icons.css index 9f030eeb93..6eed96081b 100644 --- a/src/sql/base/browser/ui/taskbar/media/icons.css +++ b/src/sql/base/browser/ui/taskbar/media/icons.css @@ -104,3 +104,23 @@ .hc-black .icon.saveAsImage { background-image: url('save_as_image_inverse.svg'); } + +.vs .icon.enablesqlcmd { + background-image: url('enable_sqlcmd.svg'); +} + +.vs-dark .icon.enablesqlcmd, +.hc-black .icon.enablesqlcmd { + background-image: url('enable_sqlcmd_inverse.svg'); + background-repeat: no-repeat; +} + +.vs .icon.disablesqlcmd { + background-image: url('disable_sqlcmd.svg'); +} + +.vs-dark .icon.disablesqlcmd, +.hc-black .icon.disablesqlcmd { + background-image: url('disable_sqlcmd_inverse.svg'); + background-repeat: no-repeat; +} diff --git a/src/sql/workbench/parts/query/browser/queryActions.ts b/src/sql/workbench/parts/query/browser/queryActions.ts index 55b91b8164..d7b96f213a 100644 --- a/src/sql/workbench/parts/query/browser/queryActions.ts +++ b/src/sql/workbench/parts/query/browser/queryActions.ts @@ -15,7 +15,7 @@ import { IExtensionTipsService } from 'vs/workbench/services/extensionManagement import Severity from 'vs/base/common/severity'; import { append, $ } from 'vs/base/browser/dom'; -import { ISelectionData } from 'azdata'; +import { ISelectionData, QueryExecutionOptions } from 'azdata'; import { IConnectionManagementService, IConnectionParams, @@ -28,6 +28,7 @@ import { IQueryModelService } from 'sql/platform/query/common/queryModel'; import { SelectBox } from 'sql/base/browser/ui/selectBox/selectBox'; import { attachEditableDropdownStyler, attachSelectBoxStyler } from 'sql/platform/theme/common/styler'; import { Dropdown } from 'sql/base/parts/editableDropdown/browser/dropdown'; +import { IQueryManagementService } from 'sql/platform/query/common/queryManagement'; /** * Action class that query-based Actions will extend. This base class automatically handles activating and @@ -415,6 +416,61 @@ export class ListDatabasesAction extends QueryTaskbarAction { } } +/** + * Action class that toggles SQLCMD mode for the editor + */ +export class ToggleSqlCmdModeAction extends QueryTaskbarAction { + + public static EnableSqlcmdClass = 'enablesqlcmd'; + public static DisableSqlcmdClass = 'disablesqlcmd'; + public static ID = 'ToggleSqlCmdModeAction'; + + private _enablesqlcmdLabel = nls.localize('enablesqlcmdLabel', "Enable SQLCMD Mode"); + private _disablesqlcmdLabel = nls.localize('disablesqlcmdLabel', "Disable SQLCMD Mode"); + constructor( + editor: QueryEditor, + private _isSqlCmdMode: boolean, + @IQueryManagementService protected readonly queryManagementService: IQueryManagementService, + @IConfigurationService protected readonly configurationService: IConfigurationService, + @IConnectionManagementService connectionManagementService: IConnectionManagementService + ) { + super(connectionManagementService, editor, ToggleSqlCmdModeAction.ID, undefined); + } + + public get isSqlCmdMode(): boolean { + return this._isSqlCmdMode; + } + + public set isSqlCmdMode(value: boolean) { + this._isSqlCmdMode = value; + this.updateLabelAndIcon(); + } + + private updateLabelAndIcon(): void { + // show option to disable sql cmd mode if already enabled + this.label = this.isSqlCmdMode ? this._disablesqlcmdLabel : this._enablesqlcmdLabel; + this.isSqlCmdMode ? this.updateCssClass(ToggleSqlCmdModeAction.DisableSqlcmdClass) : this.updateCssClass(ToggleSqlCmdModeAction.EnableSqlcmdClass); + } + + private setSqlCmdModeFalse() { + + } + + public run(): Promise { + const toSqlCmdState = !this.isSqlCmdMode; // input.state change triggers event that changes this.isSqlCmdMode, so store it before using + this.editor.input.state.isSqlCmdMode = toSqlCmdState; + + // set query options + let queryoptions: QueryExecutionOptions = { options: new Map() }; + queryoptions.options['isSqlCmdMode'] = toSqlCmdState; + this.queryManagementService.setQueryExecutionOptions(this.editor.input.uri, queryoptions); + + // set intellisense options + toSqlCmdState ? this.connectionManagementService.doChangeLanguageFlavor(this.editor.input.uri, 'sqlcmd', 'MSSQL') : this.connectionManagementService.doChangeLanguageFlavor(this.editor.input.uri, 'sql', 'MSSQL'); + return Promise.resolve(null); + } +} + /* * Action item that handles the dropdown (combobox) that lists the available databases. * Based off StartDebugActionItem. diff --git a/src/sql/workbench/parts/query/browser/queryEditor.ts b/src/sql/workbench/parts/query/browser/queryEditor.ts index e4a59fb3ff..2e1b9e3170 100644 --- a/src/sql/workbench/parts/query/browser/queryEditor.ts +++ b/src/sql/workbench/parts/query/browser/queryEditor.ts @@ -85,6 +85,7 @@ export class QueryEditor extends BaseEditor { private _estimatedQueryPlanAction: actions.EstimatedQueryPlanAction; private _actualQueryPlanAction: actions.ActualQueryPlanAction; private _listDatabasesActionItem: actions.ListDatabasesActionItem; + private _toggleSqlcmdMode: actions.ToggleSqlCmdModeAction; constructor( @ITelemetryService telemetryService: ITelemetryService, @@ -181,6 +182,7 @@ export class QueryEditor extends BaseEditor { this._listDatabasesAction = this.instantiationService.createInstance(actions.ListDatabasesAction, this); this._estimatedQueryPlanAction = this.instantiationService.createInstance(actions.EstimatedQueryPlanAction, this); this._actualQueryPlanAction = this.instantiationService.createInstance(actions.ActualQueryPlanAction, this); + this._toggleSqlcmdMode = this.instantiationService.createInstance(actions.ToggleSqlCmdModeAction, this, false); this.setTaskbarContent(); @@ -205,6 +207,10 @@ export class QueryEditor extends BaseEditor { } } + if (stateChangeEvent.sqlCmdModeChanged) { + this._toggleSqlcmdMode.isSqlCmdMode = this.input.state.isSqlCmdMode; + } + if (stateChangeEvent.connectingChange) { this._runQueryAction.enabled = !this.input.state.connecting; this._estimatedQueryPlanAction.enabled = !this.input.state.connecting; @@ -259,7 +265,8 @@ export class QueryEditor extends BaseEditor { { action: this._changeConnectionAction }, { action: this._listDatabasesAction }, { element: separator }, - { action: this._estimatedQueryPlanAction } + { action: this._estimatedQueryPlanAction }, + { action: this._toggleSqlcmdMode } ]; // Remove the estimated query plan action if preview features are not enabled @@ -309,7 +316,7 @@ export class QueryEditor extends BaseEditor { dispose(this.inputDisposables); this.inputDisposables = []; this.inputDisposables.push(this.input.state.onChange(c => this.updateState(c))); - this.updateState({ connectingChange: true, connectedChange: true, executingChange: true, resultsVisibleChange: true }); + this.updateState({ connectingChange: true, connectedChange: true, executingChange: true, resultsVisibleChange: true, sqlCmdModeChanged: true }); const editorViewState = this.loadTextEditorViewState(this.input.getResource()); diff --git a/src/sql/workbench/parts/query/common/queryInput.ts b/src/sql/workbench/parts/query/common/queryInput.ts index 6ac56eb05c..3a85d67cd4 100644 --- a/src/sql/workbench/parts/query/common/queryInput.ts +++ b/src/sql/workbench/parts/query/common/queryInput.ts @@ -42,10 +42,12 @@ export interface IQueryEditorStateChange { resultsVisibleChange?: boolean; executingChange?: boolean; connectingChange?: boolean; + sqlCmdModeChanged?: boolean; } export class QueryEditorState extends Disposable { private _connected = false; + private _isSqlCmdMode = false; private _resultsVisible = false; private _executing = false; private _connecting = false; @@ -96,6 +98,17 @@ export class QueryEditorState extends Disposable { public get executing(): boolean { return this._executing; } + + public set isSqlCmdMode(val: boolean) { + if (val !== this._isSqlCmdMode) { + this._isSqlCmdMode = val; + this._onChange.fire({ sqlCmdModeChanged: true }); + } + } + + public get isSqlCmdMode(): boolean { + return this._isSqlCmdMode; + } } /**