d8513d6b2decebe9d94e678ea4b96b22ed4e97ab6e3cd485b2e1f8268af65ba6e6e08dbc18678a9f8d8d6a2bb3f04426c2b6a99098944bd8b381764396911e 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. /*---------------------------------------------------------------------------------------------
  2. * Copyright (c) Microsoft Corporation. All rights reserved.
  3. * Licensed under the MIT License. See License.txt in the project root for license information.
  4. *--------------------------------------------------------------------------------------------*/
  5. import { SingleCursorState } from '../cursorCommon.js';
  6. import { Position } from '../core/position.js';
  7. import { Range } from '../core/range.js';
  8. export class ColumnSelection {
  9. static columnSelect(config, model, fromLineNumber, fromVisibleColumn, toLineNumber, toVisibleColumn) {
  10. const lineCount = Math.abs(toLineNumber - fromLineNumber) + 1;
  11. const reversed = (fromLineNumber > toLineNumber);
  12. const isRTL = (fromVisibleColumn > toVisibleColumn);
  13. const isLTR = (fromVisibleColumn < toVisibleColumn);
  14. const result = [];
  15. // console.log(`fromVisibleColumn: ${fromVisibleColumn}, toVisibleColumn: ${toVisibleColumn}`);
  16. for (let i = 0; i < lineCount; i++) {
  17. const lineNumber = fromLineNumber + (reversed ? -i : i);
  18. const startColumn = config.columnFromVisibleColumn(model, lineNumber, fromVisibleColumn);
  19. const endColumn = config.columnFromVisibleColumn(model, lineNumber, toVisibleColumn);
  20. const visibleStartColumn = config.visibleColumnFromColumn(model, new Position(lineNumber, startColumn));
  21. const visibleEndColumn = config.visibleColumnFromColumn(model, new Position(lineNumber, endColumn));
  22. // console.log(`lineNumber: ${lineNumber}: visibleStartColumn: ${visibleStartColumn}, visibleEndColumn: ${visibleEndColumn}`);
  23. if (isLTR) {
  24. if (visibleStartColumn > toVisibleColumn) {
  25. continue;
  26. }
  27. if (visibleEndColumn < fromVisibleColumn) {
  28. continue;
  29. }
  30. }
  31. if (isRTL) {
  32. if (visibleEndColumn > fromVisibleColumn) {
  33. continue;
  34. }
  35. if (visibleStartColumn < toVisibleColumn) {
  36. continue;
  37. }
  38. }
  39. result.push(new SingleCursorState(new Range(lineNumber, startColumn, lineNumber, startColumn), 0, new Position(lineNumber, endColumn), 0));
  40. }
  41. if (result.length === 0) {
  42. // We are after all the lines, so add cursor at the end of each line
  43. for (let i = 0; i < lineCount; i++) {
  44. const lineNumber = fromLineNumber + (reversed ? -i : i);
  45. const maxColumn = model.getLineMaxColumn(lineNumber);
  46. result.push(new SingleCursorState(new Range(lineNumber, maxColumn, lineNumber, maxColumn), 0, new Position(lineNumber, maxColumn), 0));
  47. }
  48. }
  49. return {
  50. viewStates: result,
  51. reversed: reversed,
  52. fromLineNumber: fromLineNumber,
  53. fromVisualColumn: fromVisibleColumn,
  54. toLineNumber: toLineNumber,
  55. toVisualColumn: toVisibleColumn
  56. };
  57. }
  58. static columnSelectLeft(config, model, prevColumnSelectData) {
  59. let toViewVisualColumn = prevColumnSelectData.toViewVisualColumn;
  60. if (toViewVisualColumn > 0) {
  61. toViewVisualColumn--;
  62. }
  63. return ColumnSelection.columnSelect(config, model, prevColumnSelectData.fromViewLineNumber, prevColumnSelectData.fromViewVisualColumn, prevColumnSelectData.toViewLineNumber, toViewVisualColumn);
  64. }
  65. static columnSelectRight(config, model, prevColumnSelectData) {
  66. let maxVisualViewColumn = 0;
  67. const minViewLineNumber = Math.min(prevColumnSelectData.fromViewLineNumber, prevColumnSelectData.toViewLineNumber);
  68. const maxViewLineNumber = Math.max(prevColumnSelectData.fromViewLineNumber, prevColumnSelectData.toViewLineNumber);
  69. for (let lineNumber = minViewLineNumber; lineNumber <= maxViewLineNumber; lineNumber++) {
  70. const lineMaxViewColumn = model.getLineMaxColumn(lineNumber);
  71. const lineMaxVisualViewColumn = config.visibleColumnFromColumn(model, new Position(lineNumber, lineMaxViewColumn));
  72. maxVisualViewColumn = Math.max(maxVisualViewColumn, lineMaxVisualViewColumn);
  73. }
  74. let toViewVisualColumn = prevColumnSelectData.toViewVisualColumn;
  75. if (toViewVisualColumn < maxVisualViewColumn) {
  76. toViewVisualColumn++;
  77. }
  78. return this.columnSelect(config, model, prevColumnSelectData.fromViewLineNumber, prevColumnSelectData.fromViewVisualColumn, prevColumnSelectData.toViewLineNumber, toViewVisualColumn);
  79. }
  80. static columnSelectUp(config, model, prevColumnSelectData, isPaged) {
  81. const linesCount = isPaged ? config.pageSize : 1;
  82. const toViewLineNumber = Math.max(1, prevColumnSelectData.toViewLineNumber - linesCount);
  83. return this.columnSelect(config, model, prevColumnSelectData.fromViewLineNumber, prevColumnSelectData.fromViewVisualColumn, toViewLineNumber, prevColumnSelectData.toViewVisualColumn);
  84. }
  85. static columnSelectDown(config, model, prevColumnSelectData, isPaged) {
  86. const linesCount = isPaged ? config.pageSize : 1;
  87. const toViewLineNumber = Math.min(model.getLineCount(), prevColumnSelectData.toViewLineNumber + linesCount);
  88. return this.columnSelect(config, model, prevColumnSelectData.fromViewLineNumber, prevColumnSelectData.fromViewVisualColumn, toViewLineNumber, prevColumnSelectData.toViewVisualColumn);
  89. }
  90. }