diff --git a/src/sql/base/browser/ui/table/plugins/cellSelectionModel.plugin.ts b/src/sql/base/browser/ui/table/plugins/cellSelectionModel.plugin.ts index c57b1a669f..a762ecb524 100644 --- a/src/sql/base/browser/ui/table/plugins/cellSelectionModel.plugin.ts +++ b/src/sql/base/browser/ui/table/plugins/cellSelectionModel.plugin.ts @@ -114,7 +114,7 @@ export class CellSelectionModel implements Slick.SelectionModel; - if (e.shiftKey) { + if (e.ctrlKey) { ranges = this.getSelectedRanges(); ranges.push(new Slick.Range(0, columnIndex, this.grid.getDataLength() - 1, columnIndex)); } else { @@ -230,9 +230,17 @@ export class CellSelectionModel implements Slick.SelectionModel; ranges = this.getSelectedRanges(); - ranges = this.insertIntoSelections(ranges, new Slick.Range(args.row, args.cell)); - this.grid.setActiveCell(args.row, args.cell); + let selectedRange: Slick.Range; + if (args.cell === 0) { + selectedRange = new Slick.Range(args.row, 1, args.row, args.grid.getColumns().length - 1); + } else { + selectedRange = new Slick.Range(args.row, args.cell); + + } + ranges = this.insertIntoSelections(ranges, selectedRange); + + this.grid.setActiveCell(selectedRange.toRow, selectedRange.toCell); this.setSelectedRanges(ranges); e.preventDefault(); diff --git a/src/sql/platform/query/common/gridDataProvider.ts b/src/sql/platform/query/common/gridDataProvider.ts index 5feef208dc..d7243b2dd0 100644 --- a/src/sql/platform/query/common/gridDataProvider.ts +++ b/src/sql/platform/query/common/gridDataProvider.ts @@ -43,15 +43,13 @@ export interface IGridDataProvider { } export async function getResultsString(provider: IGridDataProvider, selection: Slick.Range[], includeHeaders?: boolean): Promise { - let headers: Map = new Map(); - let rows: Map> = new Map(); - let copyTable: string[][] = []; + let headers: Map = new Map(); // Maps a column index -> header + let rows: Map> = new Map(); // Maps row index -> column index -> actual row value const eol = provider.getEolString(); // create a mapping of the ranges to get promises let tasks = selection.map((range, i) => { return async () => { - let selectionsCopy = selection; let startCol = range.fromCell; let startRow = range.fromRow; @@ -103,8 +101,9 @@ export async function getResultsString(provider: IGridDataProvider, selection: S copyString = [...headers.values()].join('\t').concat(eol); } - const rowKeys = [...headers.keys()]; + const rowKeys = [...headers.keys()].sort(); + rows = new Map([...rows.entries()].sort()); for (let rowEntry of rows) { let rowMap = rowEntry[1]; for (let rowIdx of rowKeys) { @@ -115,9 +114,11 @@ export async function getResultsString(provider: IGridDataProvider, selection: S } copyString = copyString.concat('\t'); } + // Removes the tab seperator from the end of a row + copyString = copyString.slice(0, -1 * '\t'.length); copyString = copyString.concat(eol); } - // Removes EoL from the end of the string + // Removes EoL from the end of the result copyString = copyString.slice(0, -1 * eol.length); return copyString;