From 71c1ed6c49eb06071d8dcf0c89b46cc0e23b0f7d Mon Sep 17 00:00:00 2001 From: Anthony Dresser Date: Fri, 11 Jan 2019 10:25:57 -0800 Subject: [PATCH] Add state for column sizing (#3683) * add state for column sizing * work properly with auto size columns --- src/sql/base/browser/ui/table/table.ts | 4 ++++ src/sql/parts/query/editor/gridPanel.ts | 17 +++++++++++++---- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/sql/base/browser/ui/table/table.ts b/src/sql/base/browser/ui/table/table.ts index 56cd790bb6..4d61d8fb78 100644 --- a/src/sql/base/browser/ui/table/table.ts +++ b/src/sql/base/browser/ui/table/table.ts @@ -46,6 +46,9 @@ export class Table extends Widget implements IThemabl private _onClick = new Emitter(); public readonly onClick: Event = this._onClick.event; + private _onColumnResize = new Emitter(); + public readonly onColumnResize = this._onColumnResize.event; + constructor(parent: HTMLElement, configuration?: ITableConfiguration, options?: Slick.GridOptions) { super(); if (!configuration || !configuration.dataProvider || isArray(configuration.dataProvider)) { @@ -105,6 +108,7 @@ export class Table extends Widget implements IThemabl this.mapMouseEvent(this._grid.onContextMenu, this._onContextMenu); this.mapMouseEvent(this._grid.onClick, this._onClick); + this._grid.onColumnsResized.subscribe(() => this._onColumnResize.fire()); } private mapMouseEvent(slickEvent: Slick.Event, emitter: Emitter) { diff --git a/src/sql/parts/query/editor/gridPanel.ts b/src/sql/parts/query/editor/gridPanel.ts index aba81b7646..d79b342dcc 100644 --- a/src/sql/parts/query/editor/gridPanel.ts +++ b/src/sql/parts/query/editor/gridPanel.ts @@ -90,6 +90,7 @@ export class GridTableState extends Disposable { /* The top row of the current scroll */ public scrollPositionY = 0; public scrollPositionX = 0; + public columnSizes: number[] = undefined; public selection: Slick.Range[]; public activeCell: Slick.Cell; @@ -287,8 +288,7 @@ export class GridPanel extends ViewletPanel { this._state.tableStates.push(tableState); } } - let table = this.instantiationService.createInstance(GridTable, this.runner, set); - table.state = tableState; + let table = this.instantiationService.createInstance(GridTable, this.runner, set, tableState); this.tableDisposable.push(tableState.onMaximizedChange(e => { if (e) { this.maximizeTable(table.id); @@ -418,6 +418,7 @@ class GridTable extends Disposable implements IView { constructor( private runner: QueryRunner, private _resultSet: sqlops.ResultSetSummary, + state: GridTableState, @IContextMenuService private contextMenuService: IContextMenuService, @IInstantiationService private instantiationService: IInstantiationService, @IEditorService private editorService: IEditorService, @@ -425,6 +426,7 @@ class GridTable extends Disposable implements IView { @IConfigurationService private configurationService: IConfigurationService ) { super(); + this.state = state; this.container.style.width = '100%'; this.container.style.height = '100%'; this.container.className = 'grid-panel'; @@ -438,7 +440,8 @@ class GridTable extends Disposable implements IView { ? 'XML Showplan' : escape(c.columnName), field: i.toString(), - formatter: isLinked ? hyperLinkFormatter : textFormatter + formatter: isLinked ? hyperLinkFormatter : textFormatter, + width: this.state.columnSizes && this.state.columnSizes[i] ? this.state.columnSizes[i] : undefined }; }); } @@ -509,7 +512,7 @@ class GridTable extends Disposable implements IView { this.table = this._register(new Table(tableContainer, { dataProvider: this.dataProvider, columns: this.columns }, tableOptions)); this.table.setSelectionModel(this.selectionModel); this.table.registerPlugin(new MouseWheelSupport()); - this.table.registerPlugin(new AutoColumnSize({ autoSizeOnRender: this.configurationService.getValue('resultsGrid.autoSizeColumns') })); + this.table.registerPlugin(new AutoColumnSize({ autoSizeOnRender: !this.state.columnSizes && this.configurationService.getValue('resultsGrid.autoSizeColumns') })); this.table.registerPlugin(copyHandler); this.table.registerPlugin(this.rowNumberColumn); this.table.registerPlugin(new AdditionalKeyBindings()); @@ -565,6 +568,12 @@ class GridTable extends Disposable implements IView { } }); + // we need to remove the first column since this is the row number + this.table.onColumnResize(() => { + let columnSizes = this.table.grid.getColumns().slice(1).map(v => v.width); + this.state.columnSizes = columnSizes; + }); + this.table.grid.onActiveCellChanged.subscribe(e => { if (this.state) { this.state.activeCell = this.table.grid.getActiveCell();