moveCaretCommand.js 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  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 MoveCaretCommand {
  8. constructor(selection, isMovingLeft) {
  9. this._selection = selection;
  10. this._isMovingLeft = isMovingLeft;
  11. }
  12. getEditOperations(model, builder) {
  13. if (this._selection.startLineNumber !== this._selection.endLineNumber || this._selection.isEmpty()) {
  14. return;
  15. }
  16. const lineNumber = this._selection.startLineNumber;
  17. const startColumn = this._selection.startColumn;
  18. const endColumn = this._selection.endColumn;
  19. if (this._isMovingLeft && startColumn === 1) {
  20. return;
  21. }
  22. if (!this._isMovingLeft && endColumn === model.getLineMaxColumn(lineNumber)) {
  23. return;
  24. }
  25. if (this._isMovingLeft) {
  26. const rangeBefore = new Range(lineNumber, startColumn - 1, lineNumber, startColumn);
  27. const charBefore = model.getValueInRange(rangeBefore);
  28. builder.addEditOperation(rangeBefore, null);
  29. builder.addEditOperation(new Range(lineNumber, endColumn, lineNumber, endColumn), charBefore);
  30. }
  31. else {
  32. const rangeAfter = new Range(lineNumber, endColumn, lineNumber, endColumn + 1);
  33. const charAfter = model.getValueInRange(rangeAfter);
  34. builder.addEditOperation(rangeAfter, null);
  35. builder.addEditOperation(new Range(lineNumber, startColumn, lineNumber, startColumn), charAfter);
  36. }
  37. }
  38. computeCursorState(model, helper) {
  39. if (this._isMovingLeft) {
  40. return new Selection(this._selection.startLineNumber, this._selection.startColumn - 1, this._selection.endLineNumber, this._selection.endColumn - 1);
  41. }
  42. else {
  43. return new Selection(this._selection.startLineNumber, this._selection.startColumn + 1, this._selection.endLineNumber, this._selection.endColumn + 1);
  44. }
  45. }
  46. }