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 @@
+
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 @@
+
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 @@
+
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 @@
+
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;
+ }
}
/**