mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-03-03 11:01:38 -05:00
Compare commits
7 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c92b88bfaf | ||
|
|
10875f26dc | ||
|
|
d62e809c18 | ||
|
|
d85bf4f6dd | ||
|
|
801e201cc3 | ||
|
|
e18e0da0c1 | ||
|
|
d046b0a412 |
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "sqlops",
|
"name": "sqlops",
|
||||||
"version": "0.33.3",
|
"version": "0.33.4",
|
||||||
"distro": "8c3e97e3425cc9814496472ab73e076de2ba99ee",
|
"distro": "8c3e97e3425cc9814496472ab73e076de2ba99ee",
|
||||||
"author": {
|
"author": {
|
||||||
"name": "Microsoft Corporation"
|
"name": "Microsoft Corporation"
|
||||||
|
|||||||
@@ -89,7 +89,7 @@ export class CellRangeSelector<T> implements ICellRangeSelector<T> {
|
|||||||
|
|
||||||
this.canvas.classList.add(this.options.dragClass);
|
this.canvas.classList.add(this.options.dragClass);
|
||||||
|
|
||||||
this.grid.focus();
|
this.grid.setActiveCell(cell.row, cell.cell);
|
||||||
|
|
||||||
let start = this.grid.getCellFromPoint(
|
let start = this.grid.getCellFromPoint(
|
||||||
dd.startX - $(this.canvas).offset().left,
|
dd.startX - $(this.canvas).offset().left,
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ export class TasksWidget extends DashboardWidget implements IDashboardWidget, On
|
|||||||
}).filter(i => !!i);
|
}).filter(i => !!i);
|
||||||
}
|
}
|
||||||
|
|
||||||
this._tasks = tasks.map(i => TaskRegistry.getCommandActionById(i)).filter(v => !!v);
|
this._tasks = tasks.map(i => MenuRegistry.getCommand(i)).filter(v => !!v);
|
||||||
}
|
}
|
||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
*--------------------------------------------------------------------------------------------*/
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
import DivContainer from './divContainer.component';
|
||||||
import FlexContainer from './flexContainer.component';
|
import FlexContainer from './flexContainer.component';
|
||||||
import FormContainer from './formContainer.component';
|
import FormContainer from './formContainer.component';
|
||||||
import ToolbarContainer from './toolbarContainer.component';
|
import ToolbarContainer from './toolbarContainer.component';
|
||||||
@@ -25,6 +25,9 @@ import EditorComponent from './editor.component';
|
|||||||
import { registerComponentType } from 'sql/platform/dashboard/common/modelComponentRegistry';
|
import { registerComponentType } from 'sql/platform/dashboard/common/modelComponentRegistry';
|
||||||
import { ModelComponentTypes } from 'sql/workbench/api/common/sqlExtHostTypes';
|
import { ModelComponentTypes } from 'sql/workbench/api/common/sqlExtHostTypes';
|
||||||
|
|
||||||
|
export const DIV_CONTAINER = 'div-container';
|
||||||
|
registerComponentType(DIV_CONTAINER, ModelComponentTypes.DivContainer, DivContainer);
|
||||||
|
|
||||||
export const FLEX_CONTAINER = 'flex-container';
|
export const FLEX_CONTAINER = 'flex-container';
|
||||||
registerComponentType(FLEX_CONTAINER, ModelComponentTypes.FlexContainer, FlexContainer);
|
registerComponentType(FLEX_CONTAINER, ModelComponentTypes.FlexContainer, FlexContainer);
|
||||||
|
|
||||||
|
|||||||
120
src/sql/parts/modelComponents/divContainer.component.ts
Normal file
120
src/sql/parts/modelComponents/divContainer.component.ts
Normal file
@@ -0,0 +1,120 @@
|
|||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
import 'vs/css!./divContainer';
|
||||||
|
|
||||||
|
import {
|
||||||
|
Component, Input, Inject, ChangeDetectorRef, forwardRef, ComponentFactoryResolver,
|
||||||
|
ViewChild, ViewChildren, ElementRef, Injector, OnDestroy, QueryList,
|
||||||
|
} from '@angular/core';
|
||||||
|
|
||||||
|
import { IComponent, IComponentDescriptor, IModelStore } from 'sql/parts/modelComponents/interfaces';
|
||||||
|
import * as sqlops from 'sqlops';
|
||||||
|
|
||||||
|
import { DashboardServiceInterface } from 'sql/parts/dashboard/services/dashboardServiceInterface.service';
|
||||||
|
import { ContainerBase } from 'sql/parts/modelComponents/componentBase';
|
||||||
|
import { ModelComponentWrapper } from 'sql/parts/modelComponents/modelComponentWrapper.component';
|
||||||
|
|
||||||
|
import types = require('vs/base/common/types');
|
||||||
|
|
||||||
|
class DivItem {
|
||||||
|
constructor(public descriptor: IComponentDescriptor, public config: sqlops.DivItemLayout) { }
|
||||||
|
}
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
template: `
|
||||||
|
<div #divContainer *ngIf="items" class="divContainer" [style.height]="height" [style.width]="width">
|
||||||
|
<div *ngFor="let item of items" [style.order]="getItemOrder(item)" [ngStyle]="getItemStyles(item)">
|
||||||
|
<model-component-wrapper [descriptor]="item.descriptor" [modelStore]="modelStore">
|
||||||
|
</model-component-wrapper>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
`
|
||||||
|
})
|
||||||
|
export default class DivContainer extends ContainerBase<sqlops.DivItemLayout> implements IComponent, OnDestroy {
|
||||||
|
@Input() descriptor: IComponentDescriptor;
|
||||||
|
@Input() modelStore: IModelStore;
|
||||||
|
@ViewChild('divContainer', { read: ElementRef }) divContainer;
|
||||||
|
private _height: string;
|
||||||
|
private _width: string;
|
||||||
|
private _overflowY: string;
|
||||||
|
|
||||||
|
constructor(
|
||||||
|
@Inject(forwardRef(() => ChangeDetectorRef)) changeRef: ChangeDetectorRef,
|
||||||
|
@Inject(forwardRef(() => ElementRef)) el: ElementRef
|
||||||
|
) {
|
||||||
|
super(changeRef, el);
|
||||||
|
this._overflowY = ''; // default
|
||||||
|
}
|
||||||
|
|
||||||
|
ngOnInit(): void {
|
||||||
|
this.baseInit();
|
||||||
|
}
|
||||||
|
|
||||||
|
ngOnDestroy(): void {
|
||||||
|
this.baseDestroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// IComponent implementation
|
||||||
|
|
||||||
|
public setLayout(layout: sqlops.DivLayout): void {
|
||||||
|
this._height = this.convertSize(layout.height);
|
||||||
|
this._width = this.convertSize(layout.width);
|
||||||
|
this.layout();
|
||||||
|
}
|
||||||
|
|
||||||
|
public setProperties(properties: { [key: string]: any; }): void {
|
||||||
|
super.setProperties(properties);
|
||||||
|
if (this.overflowY !== this._overflowY) {
|
||||||
|
this.updateOverflowY();
|
||||||
|
}
|
||||||
|
this.updateScroll();
|
||||||
|
}
|
||||||
|
|
||||||
|
private updateOverflowY() {
|
||||||
|
this._overflowY = this.overflowY;
|
||||||
|
if (this._overflowY) {
|
||||||
|
let element = <HTMLElement> this.divContainer.nativeElement;
|
||||||
|
element.style.overflowY = this._overflowY;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private updateScroll() {
|
||||||
|
let element = <HTMLElement> this.divContainer.nativeElement;
|
||||||
|
element.scrollTop = element.scrollTop - this.yOffsetChange;
|
||||||
|
element.dispatchEvent(new Event('scroll'));
|
||||||
|
}
|
||||||
|
|
||||||
|
// CSS-bound properties
|
||||||
|
public get height(): string {
|
||||||
|
return this._height;
|
||||||
|
}
|
||||||
|
|
||||||
|
public get width(): string {
|
||||||
|
return this._width;
|
||||||
|
}
|
||||||
|
|
||||||
|
// CSS-bound properties
|
||||||
|
public get overflowY(): string {
|
||||||
|
return this.getPropertyOrDefault<sqlops.DivContainerProperties, any>((props) => props.overflowY, '');
|
||||||
|
}
|
||||||
|
public set overflowY(newValue: string) {
|
||||||
|
this.setPropertyFromUI<sqlops.DivContainerProperties, any>((properties, newValue) => { properties.overflowY = newValue; }, newValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
public get yOffsetChange(): number {
|
||||||
|
return this.getPropertyOrDefault<sqlops.DivContainerProperties, any>((props) => props.yOffsetChange, 0);
|
||||||
|
}
|
||||||
|
public set yOffsetChange(newValue: number) {
|
||||||
|
this.setPropertyFromUI<sqlops.DivContainerProperties, any>((properties, newValue) => { properties.yOffsetChange = newValue; }, newValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
private getItemOrder(item: DivItem): number {
|
||||||
|
return item.config ? item.config.order : 0;
|
||||||
|
}
|
||||||
|
private getItemStyles(item: DivItem): { [key: string]: string } {
|
||||||
|
return item.config && item.config.CSSStyles ? item.config.CSSStyles : {};
|
||||||
|
}
|
||||||
|
}
|
||||||
5
src/sql/parts/modelComponents/divContainer.css
Normal file
5
src/sql/parts/modelComponents/divContainer.css
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
|
||||||
|
.divContainer {
|
||||||
|
display: block;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
@@ -3,16 +3,50 @@
|
|||||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
*--------------------------------------------------------------------------------------------*/
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
import * as sqlops from 'sqlops';
|
||||||
|
|
||||||
import { TPromise } from 'vs/base/common/winjs.base';
|
import { TPromise } from 'vs/base/common/winjs.base';
|
||||||
import { IEditorModel } from 'vs/platform/editor/common/editor';
|
import { IEditorModel } from 'vs/platform/editor/common/editor';
|
||||||
import { EditorInput } from 'vs/workbench/common/editor';
|
import { EditorInput, EditorModel, ConfirmResult } from 'vs/workbench/common/editor';
|
||||||
import * as DOM from 'vs/base/browser/dom';
|
import * as DOM from 'vs/base/browser/dom';
|
||||||
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
|
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
|
||||||
import { IPartService, Parts } from 'vs/workbench/services/part/common/partService';
|
import { IPartService, Parts } from 'vs/workbench/services/part/common/partService';
|
||||||
|
|
||||||
import { DialogPane } from 'sql/platform/dialog/dialogPane';
|
import { DialogPane } from 'sql/platform/dialog/dialogPane';
|
||||||
|
import { Emitter, Event } from 'vs/base/common/event';
|
||||||
|
|
||||||
import * as sqlops from 'sqlops';
|
export type ModeViewSaveHandler = (handle: number) => Thenable<boolean>;
|
||||||
|
|
||||||
|
export class ModelViewInputModel extends EditorModel {
|
||||||
|
private dirty: boolean;
|
||||||
|
private readonly _onDidChangeDirty: Emitter<void> = this._register(new Emitter<void>());
|
||||||
|
get onDidChangeDirty(): Event<void> { return this._onDidChangeDirty.event; }
|
||||||
|
|
||||||
|
constructor(public readonly modelViewId, private readonly handle: number, private saveHandler?: ModeViewSaveHandler) {
|
||||||
|
super();
|
||||||
|
this.dirty = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
get isDirty(): boolean {
|
||||||
|
return this.dirty;
|
||||||
|
}
|
||||||
|
|
||||||
|
public setDirty(dirty: boolean): void {
|
||||||
|
if (this.dirty === dirty) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.dirty = dirty;
|
||||||
|
this._onDidChangeDirty.fire();
|
||||||
|
}
|
||||||
|
|
||||||
|
save(): TPromise<boolean> {
|
||||||
|
if (this.saveHandler) {
|
||||||
|
return TPromise.wrap(this.saveHandler(this.handle));
|
||||||
|
}
|
||||||
|
return TPromise.wrap(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
export class ModelViewInput extends EditorInput {
|
export class ModelViewInput extends EditorInput {
|
||||||
|
|
||||||
public static ID: string = 'workbench.editorinputs.ModelViewEditorInput';
|
public static ID: string = 'workbench.editorinputs.ModelViewEditorInput';
|
||||||
@@ -20,14 +54,15 @@ export class ModelViewInput extends EditorInput {
|
|||||||
private _dialogPaneContainer: HTMLElement;
|
private _dialogPaneContainer: HTMLElement;
|
||||||
private _dialogPane: DialogPane;
|
private _dialogPane: DialogPane;
|
||||||
|
|
||||||
constructor(private _title: string, private _modelViewId: string,
|
constructor(private _title: string, private _model: ModelViewInputModel,
|
||||||
private _options: sqlops.ModelViewEditorOptions,
|
private _options: sqlops.ModelViewEditorOptions,
|
||||||
@IInstantiationService private _instantiationService: IInstantiationService,
|
@IInstantiationService private _instantiationService: IInstantiationService,
|
||||||
@IPartService private readonly _partService: IPartService
|
@IPartService private readonly _partService: IPartService
|
||||||
) {
|
) {
|
||||||
super();
|
super();
|
||||||
|
this._model.onDidChangeDirty(() => this._onDidChangeDirty.fire());
|
||||||
this._container = document.createElement('div');
|
this._container = document.createElement('div');
|
||||||
this._container.id = `modelView-${_modelViewId}`;
|
this._container.id = `modelView-${_model.modelViewId}`;
|
||||||
this._partService.getContainer(Parts.EDITOR_PART).appendChild(this._container);
|
this._partService.getContainer(Parts.EDITOR_PART).appendChild(this._container);
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -37,7 +72,7 @@ export class ModelViewInput extends EditorInput {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public get modelViewId(): string {
|
public get modelViewId(): string {
|
||||||
return this._modelViewId;
|
return this._model.modelViewId;
|
||||||
}
|
}
|
||||||
|
|
||||||
public getTypeId(): string {
|
public getTypeId(): string {
|
||||||
@@ -85,6 +120,31 @@ export class ModelViewInput extends EditorInput {
|
|||||||
return this._options;
|
return this._options;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An editor that is dirty will be asked to be saved once it closes.
|
||||||
|
*/
|
||||||
|
isDirty(): boolean {
|
||||||
|
return this._model.isDirty;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Subclasses should bring up a proper dialog for the user if the editor is dirty and return the result.
|
||||||
|
*/
|
||||||
|
confirmSave(): TPromise<ConfirmResult> {
|
||||||
|
// TODO #2530 support save on close / confirm save. This is significantly more work
|
||||||
|
// as we need to either integrate with textFileService (seems like this isn't viable)
|
||||||
|
// or register our own complimentary service that handles the lifecycle operations such
|
||||||
|
// as close all, auto save etc.
|
||||||
|
return TPromise.wrap(ConfirmResult.DONT_SAVE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Saves the editor if it is dirty. Subclasses return a promise with a boolean indicating the success of the operation.
|
||||||
|
*/
|
||||||
|
save(): TPromise<boolean> {
|
||||||
|
return this._model.save();
|
||||||
|
}
|
||||||
|
|
||||||
public dispose(): void {
|
public dispose(): void {
|
||||||
if (this._dialogPane) {
|
if (this._dialogPane) {
|
||||||
this._dialogPane.dispose();
|
this._dialogPane.dispose();
|
||||||
@@ -93,6 +153,9 @@ export class ModelViewInput extends EditorInput {
|
|||||||
this._container.remove();
|
this._container.remove();
|
||||||
this._container = undefined;
|
this._container = undefined;
|
||||||
}
|
}
|
||||||
|
if (this._model) {
|
||||||
|
this._model.dispose();
|
||||||
|
}
|
||||||
super.dispose();
|
super.dispose();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ class ResultsView implements IPanelView {
|
|||||||
private container = document.createElement('div');
|
private container = document.createElement('div');
|
||||||
private currentDimension: DOM.Dimension;
|
private currentDimension: DOM.Dimension;
|
||||||
private isGridRendered = false;
|
private isGridRendered = false;
|
||||||
|
private needsGridResize = false;
|
||||||
private lastGridHeight: number;
|
private lastGridHeight: number;
|
||||||
|
|
||||||
constructor(instantiationService: IInstantiationService) {
|
constructor(instantiationService: IInstantiationService) {
|
||||||
@@ -51,19 +52,34 @@ class ResultsView implements IPanelView {
|
|||||||
this.isGridRendered = false;
|
this.isGridRendered = false;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
if (this.currentDimension) {
|
||||||
|
this.needsGridResize = false;
|
||||||
if (size > 0) {
|
if (size > 0) {
|
||||||
this.panelViewlet.addPanels([
|
this.panelViewlet.addPanels([
|
||||||
{ panel: this.gridPanel, index: 0, size: this.lastGridHeight || Math.round(this.currentDimension.height * .8) }
|
{ panel: this.gridPanel, index: 0, size: this.lastGridHeight || Math.round(this.currentDimension.height * .7) }
|
||||||
]);
|
]);
|
||||||
this.isGridRendered = true;
|
this.isGridRendered = true;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
this.panelViewlet.addPanels([
|
||||||
|
{ panel: this.gridPanel, index: 0, size: this.lastGridHeight || 200 }
|
||||||
|
]);
|
||||||
|
this.isGridRendered = true;
|
||||||
|
this.needsGridResize = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
let gridResizeList = this.gridPanel.onDidChange(e => {
|
let gridResizeList = this.gridPanel.onDidChange(e => {
|
||||||
this.panelViewlet.resizePanel(this.gridPanel, Math.round(this.currentDimension.height * .8));
|
if (this.currentDimension) {
|
||||||
|
this.needsGridResize = false;
|
||||||
|
this.panelViewlet.resizePanel(this.gridPanel, Math.round(this.currentDimension.height * .7));
|
||||||
|
} else {
|
||||||
|
this.needsGridResize = true;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
// once the user changes the sash we should stop trying to resize the grid
|
// once the user changes the sash we should stop trying to resize the grid
|
||||||
once(this.panelViewlet.onDidSashChange)(e => {
|
once(this.panelViewlet.onDidSashChange)(e => {
|
||||||
|
this.needsGridResize = false;
|
||||||
gridResizeList.dispose();
|
gridResizeList.dispose();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -79,6 +95,9 @@ class ResultsView implements IPanelView {
|
|||||||
this.gridPanel.layout(dimension.height);
|
this.gridPanel.layout(dimension.height);
|
||||||
}
|
}
|
||||||
this.currentDimension = dimension;
|
this.currentDimension = dimension;
|
||||||
|
if (this.needsGridResize) {
|
||||||
|
this.panelViewlet.resizePanel(this.gridPanel, Math.round(this.currentDimension.height * .7));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
remove(): void {
|
remove(): void {
|
||||||
|
|||||||
@@ -48,9 +48,7 @@ export abstract class Task {
|
|||||||
id: this.id,
|
id: this.id,
|
||||||
handler: (accessor, profile, args) => this.runTask(accessor, profile, args),
|
handler: (accessor, profile, args) => this.runTask(accessor, profile, args),
|
||||||
description: this._description,
|
description: this._description,
|
||||||
iconClass: this._iconClass,
|
iconClass: this._iconClass
|
||||||
iconPath: this.opts.iconPath,
|
|
||||||
title: this.title
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -62,10 +60,8 @@ export abstract class Task {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
public registerTask(showInCommandPalette: boolean = true): IDisposable {
|
public registerTask(): IDisposable {
|
||||||
if (showInCommandPalette) {
|
|
||||||
MenuRegistry.addCommand(this.toCommandAction());
|
MenuRegistry.addCommand(this.toCommandAction());
|
||||||
}
|
|
||||||
return TaskRegistry.registerTask(this.toITask());
|
return TaskRegistry.registerTask(this.toITask());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -100,8 +96,6 @@ export interface ITask {
|
|||||||
precondition?: ContextKeyExpr;
|
precondition?: ContextKeyExpr;
|
||||||
description?: ITaskHandlerDescription;
|
description?: ITaskHandlerDescription;
|
||||||
iconClass?: string;
|
iconClass?: string;
|
||||||
iconPath?: { dark: string; light?: string; };
|
|
||||||
title?: string;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface ITaskRegistry {
|
export interface ITaskRegistry {
|
||||||
@@ -110,7 +104,6 @@ export interface ITaskRegistry {
|
|||||||
getTasks(): string[];
|
getTasks(): string[];
|
||||||
getOrCreateTaskIconClassName(item: ICommandAction): string;
|
getOrCreateTaskIconClassName(item: ICommandAction): string;
|
||||||
onTaskRegistered: Event<string>;
|
onTaskRegistered: Event<string>;
|
||||||
getCommandActionById(id: string): ICommandAction;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const ids = new IdGenerator('task-icon-');
|
const ids = new IdGenerator('task-icon-');
|
||||||
@@ -121,7 +114,6 @@ export const TaskRegistry: ITaskRegistry = new class implements ITaskRegistry {
|
|||||||
private _onTaskRegistered = new Emitter<string>();
|
private _onTaskRegistered = new Emitter<string>();
|
||||||
public readonly onTaskRegistered: Event<string> = this._onTaskRegistered.event;
|
public readonly onTaskRegistered: Event<string> = this._onTaskRegistered.event;
|
||||||
private taskIdToIconClassNameMap: Map<string /* task id */, string /* CSS rule */> = new Map<string, string>();
|
private taskIdToIconClassNameMap: Map<string /* task id */, string /* CSS rule */> = new Map<string, string>();
|
||||||
private taskIdToCommandActionMap: Map<string, ICommandAction> = new Map<string, ICommandAction>();
|
|
||||||
|
|
||||||
registerTask(idOrTask: string | ITask, handler?: ITaskHandler): IDisposable {
|
registerTask(idOrTask: string | ITask, handler?: ITaskHandler): IDisposable {
|
||||||
let disposable: IDisposable;
|
let disposable: IDisposable;
|
||||||
@@ -133,16 +125,6 @@ export const TaskRegistry: ITaskRegistry = new class implements ITaskRegistry {
|
|||||||
if (idOrTask.iconClass) {
|
if (idOrTask.iconClass) {
|
||||||
this.taskIdToIconClassNameMap.set(idOrTask.id, idOrTask.iconClass);
|
this.taskIdToIconClassNameMap.set(idOrTask.id, idOrTask.iconClass);
|
||||||
}
|
}
|
||||||
if (idOrTask.iconPath && idOrTask.title) {
|
|
||||||
this.taskIdToCommandActionMap.set(idOrTask.id, {
|
|
||||||
iconLocation: {
|
|
||||||
dark: URI.parse(idOrTask.iconPath.dark),
|
|
||||||
light: URI.parse(idOrTask.iconPath.light),
|
|
||||||
},
|
|
||||||
id: idOrTask.id,
|
|
||||||
title: idOrTask.title
|
|
||||||
});
|
|
||||||
}
|
|
||||||
disposable = CommandsRegistry.registerCommand(idOrTask);
|
disposable = CommandsRegistry.registerCommand(idOrTask);
|
||||||
id = idOrTask.id;
|
id = idOrTask.id;
|
||||||
}
|
}
|
||||||
@@ -177,8 +159,4 @@ export const TaskRegistry: ITaskRegistry = new class implements ITaskRegistry {
|
|||||||
getTasks(): string[] {
|
getTasks(): string[] {
|
||||||
return this._tasks.slice(0);
|
return this._tasks.slice(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
getCommandActionById(taskId: string): ICommandAction {
|
|
||||||
return this.taskIdToCommandActionMap.get(taskId);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|||||||
61
src/sql/sqlops.proposed.d.ts
vendored
61
src/sql/sqlops.proposed.d.ts
vendored
@@ -17,6 +17,7 @@ declare module 'sqlops' {
|
|||||||
*/
|
*/
|
||||||
export interface ModelBuilder {
|
export interface ModelBuilder {
|
||||||
navContainer(): ContainerBuilder<NavContainer, any, any>;
|
navContainer(): ContainerBuilder<NavContainer, any, any>;
|
||||||
|
divContainer(): DivBuilder;
|
||||||
flexContainer(): FlexBuilder;
|
flexContainer(): FlexBuilder;
|
||||||
card(): ComponentBuilder<CardComponent>;
|
card(): ComponentBuilder<CardComponent>;
|
||||||
inputBox(): ComponentBuilder<InputBoxComponent>;
|
inputBox(): ComponentBuilder<InputBoxComponent>;
|
||||||
@@ -72,6 +73,10 @@ declare module 'sqlops' {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface DivBuilder extends ContainerBuilder<DivContainer, DivLayout, DivItemLayout> {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
export interface GroupBuilder extends ContainerBuilder<GroupContainer, GroupLayout, GroupItemLayout> {
|
export interface GroupBuilder extends ContainerBuilder<GroupContainer, GroupLayout, GroupItemLayout> {
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -346,6 +351,33 @@ declare module 'sqlops' {
|
|||||||
export interface GroupItemLayout {
|
export interface GroupItemLayout {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface DivLayout {
|
||||||
|
/**
|
||||||
|
* Container Height
|
||||||
|
*/
|
||||||
|
height?: number | string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Container Width
|
||||||
|
*/
|
||||||
|
width?: number | string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface DivItemLayout {
|
||||||
|
/**
|
||||||
|
* Matches the order CSS property and its available values.
|
||||||
|
*/
|
||||||
|
order?: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Matches the CSS style key and its available values.
|
||||||
|
*/
|
||||||
|
CSSStyles?: { [key: string]: string };
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface DivContainer extends Container<DivLayout, DivItemLayout>, DivContainerProperties {
|
||||||
|
}
|
||||||
|
|
||||||
export interface FlexContainer extends Container<FlexLayout, FlexItemLayout> {
|
export interface FlexContainer extends Container<FlexLayout, FlexItemLayout> {
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -568,6 +600,19 @@ declare module 'sqlops' {
|
|||||||
loading?: boolean;
|
loading?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface DivContainerProperties extends ComponentProperties {
|
||||||
|
/**
|
||||||
|
* Matches the overflow-y CSS property and its available values.
|
||||||
|
*/
|
||||||
|
overflowY?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Setting the scroll based on the y offset
|
||||||
|
* This is used when its child component is webview
|
||||||
|
*/
|
||||||
|
yOffsetChange?: number;
|
||||||
|
}
|
||||||
|
|
||||||
export interface CardComponent extends Component, CardProperties {
|
export interface CardComponent extends Component, CardProperties {
|
||||||
onDidActionClick: vscode.Event<ActionDescriptor>;
|
onDidActionClick: vscode.Event<ActionDescriptor>;
|
||||||
onCardSelectedChanged: vscode.Event<any>;
|
onCardSelectedChanged: vscode.Event<any>;
|
||||||
@@ -1115,11 +1160,22 @@ declare module 'sqlops' {
|
|||||||
export function createModelViewEditor(title: string, options?: ModelViewEditorOptions): ModelViewEditor;
|
export function createModelViewEditor(title: string, options?: ModelViewEditorOptions): ModelViewEditor;
|
||||||
|
|
||||||
export interface ModelViewEditor extends window.modelviewdialog.ModelViewPanel {
|
export interface ModelViewEditor extends window.modelviewdialog.ModelViewPanel {
|
||||||
|
/**
|
||||||
|
* `true` if there are unpersisted changes.
|
||||||
|
* This is editable to support extensions updating the dirty status.
|
||||||
|
*/
|
||||||
|
isDirty: boolean;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Opens the editor
|
* Opens the editor
|
||||||
*/
|
*/
|
||||||
openEditor(position?: vscode.ViewColumn): Thenable<void>;
|
openEditor(position?: vscode.ViewColumn): Thenable<void>;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers a save handler for this editor. This will be called if [supportsSave](#ModelViewEditorOptions.supportsSave)
|
||||||
|
* is set to true and the editor is marked as dirty
|
||||||
|
*/
|
||||||
|
registerSaveHandler(handler: () => Thenable<boolean>);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1128,6 +1184,11 @@ declare module 'sqlops' {
|
|||||||
* Should the model view editor's context be kept around even when the editor is no longer visible? It is false by default
|
* Should the model view editor's context be kept around even when the editor is no longer visible? It is false by default
|
||||||
*/
|
*/
|
||||||
readonly retainContextWhenHidden?: boolean;
|
readonly retainContextWhenHidden?: boolean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Does this model view editor support save?
|
||||||
|
*/
|
||||||
|
readonly supportsSave?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum DataProviderType {
|
export enum DataProviderType {
|
||||||
|
|||||||
@@ -131,6 +131,7 @@ export enum FrequencyRelativeIntervals {
|
|||||||
|
|
||||||
export enum ModelComponentTypes {
|
export enum ModelComponentTypes {
|
||||||
NavContainer,
|
NavContainer,
|
||||||
|
DivContainer,
|
||||||
FlexContainer,
|
FlexContainer,
|
||||||
Card,
|
Card,
|
||||||
InputBox,
|
InputBox,
|
||||||
|
|||||||
@@ -90,6 +90,7 @@ export class ExtHostAccountManagement extends ExtHostAccountManagementShape {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public $getSecurityToken(account: sqlops.Account): Thenable<{}> {
|
public $getSecurityToken(account: sqlops.Account): Thenable<{}> {
|
||||||
|
return this.$getAllAccounts().then(() => {
|
||||||
for (const handle in this._accounts) {
|
for (const handle in this._accounts) {
|
||||||
const providerHandle = parseInt(handle);
|
const providerHandle = parseInt(handle);
|
||||||
if (this._accounts[handle].findIndex((acct) => acct.key.accountId === account.key.accountId) !== -1) {
|
if (this._accounts[handle].findIndex((acct) => acct.key.accountId === account.key.accountId) !== -1) {
|
||||||
@@ -98,6 +99,7 @@ export class ExtHostAccountManagement extends ExtHostAccountManagementShape {
|
|||||||
}
|
}
|
||||||
|
|
||||||
throw new Error(`Account ${account.key.accountId} not found.`);
|
throw new Error(`Account ${account.key.accountId} not found.`);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public get onDidChangeAccounts(): Event<sqlops.DidChangeAccountsParams> {
|
public get onDidChangeAccounts(): Event<sqlops.DidChangeAccountsParams> {
|
||||||
|
|||||||
@@ -32,14 +32,21 @@ class ModelBuilderImpl implements sqlops.ModelBuilder {
|
|||||||
|
|
||||||
navContainer(): sqlops.ContainerBuilder<sqlops.NavContainer, any, any> {
|
navContainer(): sqlops.ContainerBuilder<sqlops.NavContainer, any, any> {
|
||||||
let id = this.getNextComponentId();
|
let id = this.getNextComponentId();
|
||||||
let container: ContainerBuilderImpl<sqlops.NavContainer, any, any> = new ContainerBuilderImpl(this._proxy, this._handle, ModelComponentTypes.NavContainer, id);
|
let container: GenericContainerBuilder<sqlops.NavContainer, any, any> = new GenericContainerBuilder(this._proxy, this._handle, ModelComponentTypes.NavContainer, id);
|
||||||
|
this._componentBuilders.set(id, container);
|
||||||
|
return container;
|
||||||
|
}
|
||||||
|
|
||||||
|
divContainer(): sqlops.DivBuilder {
|
||||||
|
let id = this.getNextComponentId();
|
||||||
|
let container = new DivContainerBuilder(this._proxy, this._handle, ModelComponentTypes.DivContainer, id);
|
||||||
this._componentBuilders.set(id, container);
|
this._componentBuilders.set(id, container);
|
||||||
return container;
|
return container;
|
||||||
}
|
}
|
||||||
|
|
||||||
flexContainer(): sqlops.FlexBuilder {
|
flexContainer(): sqlops.FlexBuilder {
|
||||||
let id = this.getNextComponentId();
|
let id = this.getNextComponentId();
|
||||||
let container: ContainerBuilderImpl<sqlops.FlexContainer, any, any> = new ContainerBuilderImpl<sqlops.FlexContainer, sqlops.FlexLayout, sqlops.FlexItemLayout>(this._proxy, this._handle, ModelComponentTypes.FlexContainer, id);
|
let container: GenericContainerBuilder<sqlops.FlexContainer, any, any> = new GenericContainerBuilder<sqlops.FlexContainer, sqlops.FlexLayout, sqlops.FlexItemLayout>(this._proxy, this._handle, ModelComponentTypes.FlexContainer, id);
|
||||||
this._componentBuilders.set(id, container);
|
this._componentBuilders.set(id, container);
|
||||||
return container;
|
return container;
|
||||||
}
|
}
|
||||||
@@ -60,7 +67,7 @@ class ModelBuilderImpl implements sqlops.ModelBuilder {
|
|||||||
|
|
||||||
groupContainer(): sqlops.GroupBuilder {
|
groupContainer(): sqlops.GroupBuilder {
|
||||||
let id = this.getNextComponentId();
|
let id = this.getNextComponentId();
|
||||||
let container: ContainerBuilderImpl<sqlops.GroupContainer, any, any> = new ContainerBuilderImpl<sqlops.GroupContainer, sqlops.GroupLayout, sqlops.GroupItemLayout>(this._proxy, this._handle, ModelComponentTypes.Group, id);
|
let container: GenericContainerBuilder<sqlops.GroupContainer, any, any> = new GenericContainerBuilder<sqlops.GroupContainer, sqlops.GroupLayout, sqlops.GroupItemLayout>(this._proxy, this._handle, ModelComponentTypes.Group, id);
|
||||||
this._componentBuilders.set(id, container);
|
this._componentBuilders.set(id, container);
|
||||||
return container;
|
return container;
|
||||||
}
|
}
|
||||||
@@ -241,17 +248,9 @@ class ComponentBuilderImpl<T extends sqlops.Component> implements sqlops.Compone
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class GenericComponentBuilder<T extends sqlops.Component> extends ComponentBuilderImpl<T> {
|
|
||||||
constructor(proxy: MainThreadModelViewShape, handle: number, type: ModelComponentTypes, id: string) {
|
|
||||||
super(new ComponentWrapper(proxy, handle, type, id));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
class ContainerBuilderImpl<T extends sqlops.Component, TLayout, TItemLayout> extends ComponentBuilderImpl<T> implements sqlops.ContainerBuilder<T, TLayout, TItemLayout> {
|
class ContainerBuilderImpl<T extends sqlops.Component, TLayout, TItemLayout> extends ComponentBuilderImpl<T> implements sqlops.ContainerBuilder<T, TLayout, TItemLayout> {
|
||||||
constructor(proxy: MainThreadModelViewShape, handle: number, type: ModelComponentTypes, id: string) {
|
constructor(componentWrapper: ComponentWrapper) {
|
||||||
super(new ComponentWrapper(proxy, handle, type, id));
|
super(componentWrapper);
|
||||||
}
|
}
|
||||||
|
|
||||||
withLayout(layout: TLayout): sqlops.ContainerBuilder<T, TLayout, TItemLayout> {
|
withLayout(layout: TLayout): sqlops.ContainerBuilder<T, TLayout, TItemLayout> {
|
||||||
@@ -268,7 +267,19 @@ class ContainerBuilderImpl<T extends sqlops.Component, TLayout, TItemLayout> ext
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class FormContainerBuilder extends ContainerBuilderImpl<sqlops.FormContainer, sqlops.FormLayout, sqlops.FormItemLayout> implements sqlops.FormBuilder {
|
class GenericContainerBuilder<T extends sqlops.Component, TLayout, TItemLayout> extends ContainerBuilderImpl<T, TLayout, TItemLayout> {
|
||||||
|
constructor(proxy: MainThreadModelViewShape, handle: number, type: ModelComponentTypes, id: string) {
|
||||||
|
super(new ComponentWrapper(proxy, handle, type, id));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class DivContainerBuilder extends ContainerBuilderImpl<sqlops.DivContainer, sqlops.DivLayout, sqlops.DivItemLayout> {
|
||||||
|
constructor(proxy: MainThreadModelViewShape, handle: number, type: ModelComponentTypes, id: string) {
|
||||||
|
super(new DivContainerWrapper(proxy, handle, type, id));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class FormContainerBuilder extends GenericContainerBuilder<sqlops.FormContainer, sqlops.FormLayout, sqlops.FormItemLayout> implements sqlops.FormBuilder {
|
||||||
constructor(proxy: MainThreadModelViewShape, handle: number, type: ModelComponentTypes, id: string, private _builder: ModelBuilderImpl) {
|
constructor(proxy: MainThreadModelViewShape, handle: number, type: ModelComponentTypes, id: string, private _builder: ModelBuilderImpl) {
|
||||||
super(proxy, handle, type, id);
|
super(proxy, handle, type, id);
|
||||||
}
|
}
|
||||||
@@ -376,7 +387,7 @@ class FormContainerBuilder extends ContainerBuilderImpl<sqlops.FormContainer, sq
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class ToolbarContainerBuilder extends ContainerBuilderImpl<sqlops.ToolbarContainer, sqlops.ToolbarLayout, any> implements sqlops.ToolbarBuilder {
|
class ToolbarContainerBuilder extends GenericContainerBuilder<sqlops.ToolbarContainer, sqlops.ToolbarLayout, any> implements sqlops.ToolbarBuilder {
|
||||||
withToolbarItems(components: sqlops.ToolbarComponent[]): sqlops.ContainerBuilder<sqlops.ToolbarContainer, any, any> {
|
withToolbarItems(components: sqlops.ToolbarComponent[]): sqlops.ContainerBuilder<sqlops.ToolbarContainer, any, any> {
|
||||||
this._component.itemConfigs = components.map(item => {
|
this._component.itemConfigs = components.map(item => {
|
||||||
return this.convertToItemConfig(item);
|
return this.convertToItemConfig(item);
|
||||||
@@ -844,9 +855,6 @@ class WebViewWrapper extends ComponentWrapper implements sqlops.WebViewComponent
|
|||||||
public set options(o: vscode.WebviewOptions) {
|
public set options(o: vscode.WebviewOptions) {
|
||||||
this.setProperty('options', o);
|
this.setProperty('options', o);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class EditorWrapper extends ComponentWrapper implements sqlops.EditorComponent {
|
class EditorWrapper extends ComponentWrapper implements sqlops.EditorComponent {
|
||||||
@@ -1162,6 +1170,24 @@ class FileBrowserTreeComponentWrapper extends ComponentWrapper implements sqlops
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class DivContainerWrapper extends ComponentWrapper implements sqlops.DivContainer {
|
||||||
|
public get overflowY(): string {
|
||||||
|
return this.properties['overflowY'];
|
||||||
|
}
|
||||||
|
|
||||||
|
public set overflowY(value: string) {
|
||||||
|
this.setProperty('overflowY', value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public get yOffsetChange(): number {
|
||||||
|
return this.properties['yOffsetChange'];
|
||||||
|
}
|
||||||
|
|
||||||
|
public set yOffsetChange(value: number) {
|
||||||
|
this.setProperty('yOffsetChange', value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class TreeComponentWrapper<T> extends ComponentWrapper implements sqlops.TreeComponent<T> {
|
class TreeComponentWrapper<T> extends ComponentWrapper implements sqlops.TreeComponent<T> {
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
|
|||||||
@@ -75,6 +75,9 @@ class ModelViewPanelImpl implements sqlops.window.modelviewdialog.ModelViewPanel
|
|||||||
}
|
}
|
||||||
|
|
||||||
class ModelViewEditorImpl extends ModelViewPanelImpl implements sqlops.workspace.ModelViewEditor {
|
class ModelViewEditorImpl extends ModelViewPanelImpl implements sqlops.workspace.ModelViewEditor {
|
||||||
|
private _isDirty: boolean;
|
||||||
|
private _saveHandler: () => Thenable<boolean>;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
extHostModelViewDialog: ExtHostModelViewDialog,
|
extHostModelViewDialog: ExtHostModelViewDialog,
|
||||||
extHostModelView: ExtHostModelViewShape,
|
extHostModelView: ExtHostModelViewShape,
|
||||||
@@ -84,10 +87,32 @@ class ModelViewEditorImpl extends ModelViewPanelImpl implements sqlops.workspace
|
|||||||
private _options: sqlops.ModelViewEditorOptions
|
private _options: sqlops.ModelViewEditorOptions
|
||||||
) {
|
) {
|
||||||
super('modelViewEditor', extHostModelViewDialog, extHostModelView, extensionLocation);
|
super('modelViewEditor', extHostModelViewDialog, extHostModelView, extensionLocation);
|
||||||
|
this._isDirty = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public openEditor(position?: vscode.ViewColumn): Thenable<void> {
|
public openEditor(position?: vscode.ViewColumn): Thenable<void> {
|
||||||
return this._proxy.$openEditor(this._modelViewId, this._title, this._options, position);
|
return this._proxy.$openEditor(this.handle, this._modelViewId, this._title, this._options, position);
|
||||||
|
}
|
||||||
|
|
||||||
|
public get isDirty(): boolean {
|
||||||
|
return this._isDirty;
|
||||||
|
}
|
||||||
|
|
||||||
|
public set isDirty(value: boolean) {
|
||||||
|
this._isDirty = value;
|
||||||
|
this._proxy.$setDirty(this.handle, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
registerSaveHandler(handler: () => Thenable<boolean>) {
|
||||||
|
this._saveHandler = handler;
|
||||||
|
}
|
||||||
|
|
||||||
|
public handleSave(): Thenable<boolean> {
|
||||||
|
if (this._saveHandler) {
|
||||||
|
return Promise.resolve(this._saveHandler());
|
||||||
|
} else {
|
||||||
|
return Promise.resolve(true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -470,6 +495,11 @@ export class ExtHostModelViewDialog implements ExtHostModelViewDialogShape {
|
|||||||
return dialog.validateClose();
|
return dialog.validateClose();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public $handleSave(handle: number): Thenable<boolean> {
|
||||||
|
let editor = this._objectsByHandle.get(handle) as ModelViewEditorImpl;
|
||||||
|
return editor.handleSave();
|
||||||
|
}
|
||||||
|
|
||||||
public openDialog(dialog: sqlops.window.modelviewdialog.Dialog): void {
|
public openDialog(dialog: sqlops.window.modelviewdialog.Dialog): void {
|
||||||
let handle = this.getHandle(dialog);
|
let handle = this.getHandle(dialog);
|
||||||
this.updateDialogContent(dialog);
|
this.updateDialogContent(dialog);
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
|
|
||||||
import { IEditorService } from 'vs/workbench/services/editor/common/editorService';
|
import { IEditorService } from 'vs/workbench/services/editor/common/editorService';
|
||||||
import { IEditorOptions } from 'vs/platform/editor/common/editor';
|
import { IEditorOptions } from 'vs/platform/editor/common/editor';
|
||||||
|
import { IEditor } from 'vs/workbench/common/editor';
|
||||||
import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers';
|
import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers';
|
||||||
import { IExtHostContext } from 'vs/workbench/api/node/extHost.protocol';
|
import { IExtHostContext } from 'vs/workbench/api/node/extHost.protocol';
|
||||||
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
|
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
|
||||||
@@ -14,7 +15,7 @@ import { MainThreadModelViewDialogShape, SqlMainContext, ExtHostModelViewDialogS
|
|||||||
import { Dialog, DialogTab, DialogButton, WizardPage, Wizard } from 'sql/platform/dialog/dialogTypes';
|
import { Dialog, DialogTab, DialogButton, WizardPage, Wizard } from 'sql/platform/dialog/dialogTypes';
|
||||||
import { CustomDialogService } from 'sql/platform/dialog/customDialogService';
|
import { CustomDialogService } from 'sql/platform/dialog/customDialogService';
|
||||||
import { IModelViewDialogDetails, IModelViewTabDetails, IModelViewButtonDetails, IModelViewWizardPageDetails, IModelViewWizardDetails } from 'sql/workbench/api/common/sqlExtHostTypes';
|
import { IModelViewDialogDetails, IModelViewTabDetails, IModelViewButtonDetails, IModelViewWizardPageDetails, IModelViewWizardDetails } from 'sql/workbench/api/common/sqlExtHostTypes';
|
||||||
import { ModelViewInput } from 'sql/parts/modelComponents/modelEditor/modelViewInput';
|
import { ModelViewInput, ModelViewInputModel, ModeViewSaveHandler } from 'sql/parts/modelComponents/modelEditor/modelViewInput';
|
||||||
|
|
||||||
import * as vscode from 'vscode';
|
import * as vscode from 'vscode';
|
||||||
import * as sqlops from 'sqlops';
|
import * as sqlops from 'sqlops';
|
||||||
@@ -28,6 +29,7 @@ export class MainThreadModelViewDialog implements MainThreadModelViewDialogShape
|
|||||||
private readonly _wizardPages = new Map<number, WizardPage>();
|
private readonly _wizardPages = new Map<number, WizardPage>();
|
||||||
private readonly _wizardPageHandles = new Map<WizardPage, number>();
|
private readonly _wizardPageHandles = new Map<WizardPage, number>();
|
||||||
private readonly _wizards = new Map<number, Wizard>();
|
private readonly _wizards = new Map<number, Wizard>();
|
||||||
|
private readonly _editorInputModels = new Map<number, ModelViewInputModel>();
|
||||||
private _dialogService: CustomDialogService;
|
private _dialogService: CustomDialogService;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
@@ -43,15 +45,18 @@ export class MainThreadModelViewDialog implements MainThreadModelViewDialogShape
|
|||||||
throw new Error('Method not implemented.');
|
throw new Error('Method not implemented.');
|
||||||
}
|
}
|
||||||
|
|
||||||
public $openEditor(modelViewId: string, title: string, options?: sqlops.ModelViewEditorOptions, position?: vscode.ViewColumn): Thenable<void> {
|
public $openEditor(handle: number, modelViewId: string, title: string, options?: sqlops.ModelViewEditorOptions, position?: vscode.ViewColumn): Thenable<void> {
|
||||||
return new Promise<void>((resolve, reject) => {
|
return new Promise<void>((resolve, reject) => {
|
||||||
let input = this._instatiationService.createInstance(ModelViewInput, title, modelViewId, options);
|
let saveHandler: ModeViewSaveHandler = options && options.supportsSave ? (h) => this.handleSave(h) : undefined;
|
||||||
|
let model = new ModelViewInputModel(modelViewId, handle, saveHandler);
|
||||||
|
let input = this._instatiationService.createInstance(ModelViewInput, title, model, options);
|
||||||
let editorOptions = {
|
let editorOptions = {
|
||||||
preserveFocus: true,
|
preserveFocus: true,
|
||||||
pinned: true
|
pinned: true
|
||||||
};
|
};
|
||||||
|
|
||||||
this._editorService.openEditor(input, editorOptions, position as any).then(() => {
|
this._editorService.openEditor(input, editorOptions, position as any).then((editor) => {
|
||||||
|
this._editorInputModels.set(handle, model);
|
||||||
resolve();
|
resolve();
|
||||||
}, error => {
|
}, error => {
|
||||||
reject(error);
|
reject(error);
|
||||||
@@ -59,6 +64,10 @@ export class MainThreadModelViewDialog implements MainThreadModelViewDialogShape
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private handleSave(handle: number): Thenable<boolean> {
|
||||||
|
return this._proxy.$handleSave(handle);
|
||||||
|
}
|
||||||
|
|
||||||
public $openDialog(handle: number): Thenable<void> {
|
public $openDialog(handle: number): Thenable<void> {
|
||||||
let dialog = this.getDialog(handle);
|
let dialog = this.getDialog(handle);
|
||||||
this._dialogService.showDialog(dialog);
|
this._dialogService.showDialog(dialog);
|
||||||
@@ -213,6 +222,21 @@ export class MainThreadModelViewDialog implements MainThreadModelViewDialogShape
|
|||||||
return Promise.resolve();
|
return Promise.resolve();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$setDirty(handle: number, isDirty: boolean): void {
|
||||||
|
let model = this.getEditor(handle);
|
||||||
|
if (model) {
|
||||||
|
model.setDirty(isDirty);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private getEditor(handle: number): ModelViewInputModel {
|
||||||
|
let model = this._editorInputModels.get(handle);
|
||||||
|
if (!model) {
|
||||||
|
throw new Error('No editor matching the given handle');
|
||||||
|
}
|
||||||
|
return model;
|
||||||
|
}
|
||||||
|
|
||||||
private getDialog(handle: number): Dialog {
|
private getDialog(handle: number): Dialog {
|
||||||
let dialog = this._dialogs.get(handle);
|
let dialog = this._dialogs.get(handle);
|
||||||
if (!dialog) {
|
if (!dialog) {
|
||||||
|
|||||||
@@ -672,10 +672,11 @@ export interface ExtHostModelViewDialogShape {
|
|||||||
$updateWizardPageInfo(handle: number, pageHandles: number[], currentPageIndex: number): void;
|
$updateWizardPageInfo(handle: number, pageHandles: number[], currentPageIndex: number): void;
|
||||||
$validateNavigation(handle: number, info: sqlops.window.modelviewdialog.WizardPageChangeInfo): Thenable<boolean>;
|
$validateNavigation(handle: number, info: sqlops.window.modelviewdialog.WizardPageChangeInfo): Thenable<boolean>;
|
||||||
$validateDialogClose(handle: number): Thenable<boolean>;
|
$validateDialogClose(handle: number): Thenable<boolean>;
|
||||||
|
$handleSave(handle: number): Thenable<boolean>;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface MainThreadModelViewDialogShape extends IDisposable {
|
export interface MainThreadModelViewDialogShape extends IDisposable {
|
||||||
$openEditor(modelViewId: string, title: string, options?: sqlops.ModelViewEditorOptions, position?: vscode.ViewColumn): Thenable<void>;
|
$openEditor(handle: number, modelViewId: string, title: string, options?: sqlops.ModelViewEditorOptions, position?: vscode.ViewColumn): Thenable<void>;
|
||||||
$openDialog(handle: number): Thenable<void>;
|
$openDialog(handle: number): Thenable<void>;
|
||||||
$closeDialog(handle: number): Thenable<void>;
|
$closeDialog(handle: number): Thenable<void>;
|
||||||
$setDialogDetails(handle: number, details: IModelViewDialogDetails): Thenable<void>;
|
$setDialogDetails(handle: number, details: IModelViewDialogDetails): Thenable<void>;
|
||||||
@@ -688,6 +689,7 @@ export interface MainThreadModelViewDialogShape extends IDisposable {
|
|||||||
$addWizardPage(wizardHandle: number, pageHandle: number, pageIndex: number): Thenable<void>;
|
$addWizardPage(wizardHandle: number, pageHandle: number, pageIndex: number): Thenable<void>;
|
||||||
$removeWizardPage(wizardHandle: number, pageIndex: number): Thenable<void>;
|
$removeWizardPage(wizardHandle: number, pageIndex: number): Thenable<void>;
|
||||||
$setWizardPage(wizardHandle: number, pageIndex: number): Thenable<void>;
|
$setWizardPage(wizardHandle: number, pageIndex: number): Thenable<void>;
|
||||||
|
$setDirty(handle: number, isDirty: boolean): void;
|
||||||
}
|
}
|
||||||
export interface ExtHostQueryEditorShape {
|
export interface ExtHostQueryEditorShape {
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,8 +16,8 @@ import { ShowCurrentReleaseNotesAction } from 'sql/workbench/update/releaseNotes
|
|||||||
import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle';
|
import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle';
|
||||||
import { IConfigurationRegistry, Extensions as ConfigExtensions } from 'vs/platform/configuration/common/configurationRegistry';
|
import { IConfigurationRegistry, Extensions as ConfigExtensions } from 'vs/platform/configuration/common/configurationRegistry';
|
||||||
|
|
||||||
new Actions.BackupAction().registerTask(false);
|
new Actions.BackupAction().registerTask();
|
||||||
new Actions.RestoreAction().registerTask(false);
|
new Actions.RestoreAction().registerTask();
|
||||||
new Actions.NewQueryAction().registerTask();
|
new Actions.NewQueryAction().registerTask();
|
||||||
new Actions.ConfigureDashboardAction().registerTask();
|
new Actions.ConfigureDashboardAction().registerTask();
|
||||||
|
|
||||||
|
|||||||
@@ -302,6 +302,12 @@ export class BackupAction extends Task {
|
|||||||
}
|
}
|
||||||
|
|
||||||
runTask(accessor: ServicesAccessor, profile: IConnectionProfile): TPromise<void> {
|
runTask(accessor: ServicesAccessor, profile: IConnectionProfile): TPromise<void> {
|
||||||
|
if (!profile) {
|
||||||
|
let objectExplorerService = accessor.get<IObjectExplorerService>(IObjectExplorerService);
|
||||||
|
let connectionManagementService = accessor.get<IConnectionManagementService>(IConnectionManagementService);
|
||||||
|
let workbenchEditorService = accessor.get<IEditorService>(IEditorService);
|
||||||
|
profile = TaskUtilities.getCurrentGlobalConnection(objectExplorerService, connectionManagementService, workbenchEditorService);
|
||||||
|
}
|
||||||
let configurationService = accessor.get<IWorkspaceConfigurationService>(IWorkspaceConfigurationService);
|
let configurationService = accessor.get<IWorkspaceConfigurationService>(IWorkspaceConfigurationService);
|
||||||
let previewFeaturesEnabled: boolean = configurationService.getValue('workbench')['enablePreviewFeatures'];
|
let previewFeaturesEnabled: boolean = configurationService.getValue('workbench')['enablePreviewFeatures'];
|
||||||
if (!previewFeaturesEnabled) {
|
if (!previewFeaturesEnabled) {
|
||||||
|
|||||||
Reference in New Issue
Block a user