copyLinesCommand.js 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  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 { Range } from '../../common/core/range.js';
  6. import { Selection } from '../../common/core/selection.js';
  7. export class CopyLinesCommand {
  8. constructor(selection, isCopyingDown, noop) {
  9. this._selection = selection;
  10. this._isCopyingDown = isCopyingDown;
  11. this._noop = noop || false;
  12. this._selectionDirection = 0 /* LTR */;
  13. this._selectionId = null;
  14. this._startLineNumberDelta = 0;
  15. this._endLineNumberDelta = 0;
  16. }
  17. getEditOperations(model, builder) {
  18. let s = this._selection;
  19. this._startLineNumberDelta = 0;
  20. this._endLineNumberDelta = 0;
  21. if (s.startLineNumber < s.endLineNumber && s.endColumn === 1) {
  22. this._endLineNumberDelta = 1;
  23. s = s.setEndPosition(s.endLineNumber - 1, model.getLineMaxColumn(s.endLineNumber - 1));
  24. }
  25. let sourceLines = [];
  26. for (let i = s.startLineNumber; i <= s.endLineNumber; i++) {
  27. sourceLines.push(model.getLineContent(i));
  28. }
  29. const sourceText = sourceLines.join('\n');
  30. if (sourceText === '') {
  31. // Duplicating empty line
  32. if (this._isCopyingDown) {
  33. this._startLineNumberDelta++;
  34. this._endLineNumberDelta++;
  35. }
  36. }
  37. if (this._noop) {
  38. builder.addEditOperation(new Range(s.endLineNumber, model.getLineMaxColumn(s.endLineNumber), s.endLineNumber + 1, 1), s.endLineNumber === model.getLineCount() ? '' : '\n');
  39. }
  40. else {
  41. if (!this._isCopyingDown) {
  42. builder.addEditOperation(new Range(s.endLineNumber, model.getLineMaxColumn(s.endLineNumber), s.endLineNumber, model.getLineMaxColumn(s.endLineNumber)), '\n' + sourceText);
  43. }
  44. else {
  45. builder.addEditOperation(new Range(s.startLineNumber, 1, s.startLineNumber, 1), sourceText + '\n');
  46. }
  47. }
  48. this._selectionId = builder.trackSelection(s);
  49. this._selectionDirection = this._selection.getDirection();
  50. }
  51. computeCursorState(model, helper) {
  52. let result = helper.getTrackedSelection(this._selectionId);
  53. if (this._startLineNumberDelta !== 0 || this._endLineNumberDelta !== 0) {
  54. let startLineNumber = result.startLineNumber;
  55. let startColumn = result.startColumn;
  56. let endLineNumber = result.endLineNumber;
  57. let endColumn = result.endColumn;
  58. if (this._startLineNumberDelta !== 0) {
  59. startLineNumber = startLineNumber + this._startLineNumberDelta;
  60. startColumn = 1;
  61. }
  62. if (this._endLineNumberDelta !== 0) {
  63. endLineNumber = endLineNumber + this._endLineNumberDelta;
  64. endColumn = 1;
  65. }
  66. result = Selection.createWithDirection(startLineNumber, startColumn, endLineNumber, endColumn, this._selectionDirection);
  67. }
  68. return result;
  69. }
  70. }