UNPKG

@inst/vscode-bin-darwin

Version:

BINARY ONLY - VSCode binary deployment for macOS

406 lines (404 loc) 17 kB
"use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); Object.defineProperty(exports, "__esModule", { value: true }); var MouseHelper_1 = require("./utils/MouseHelper"); var Browser = require("./utils/Browser"); var EventEmitter_1 = require("./EventEmitter"); var SelectionModel_1 = require("./SelectionModel"); var Buffer_1 = require("./Buffer"); var DRAG_SCROLL_MAX_THRESHOLD = 50; var DRAG_SCROLL_MAX_SPEED = 15; var DRAG_SCROLL_INTERVAL = 50; var WORD_SEPARATORS = ' ()[]{}\'"'; var NON_BREAKING_SPACE_CHAR = String.fromCharCode(160); var ALL_NON_BREAKING_SPACE_REGEX = new RegExp(NON_BREAKING_SPACE_CHAR, 'g'); var SelectionMode; (function (SelectionMode) { SelectionMode[SelectionMode["NORMAL"] = 0] = "NORMAL"; SelectionMode[SelectionMode["WORD"] = 1] = "WORD"; SelectionMode[SelectionMode["LINE"] = 2] = "LINE"; })(SelectionMode || (SelectionMode = {})); var SelectionManager = (function (_super) { __extends(SelectionManager, _super); function SelectionManager(_terminal, _buffer, _charMeasure) { var _this = _super.call(this) || this; _this._terminal = _terminal; _this._buffer = _buffer; _this._charMeasure = _charMeasure; _this._enabled = true; _this._initListeners(); _this.enable(); _this._model = new SelectionModel_1.SelectionModel(_terminal); _this._activeSelectionMode = SelectionMode.NORMAL; return _this; } SelectionManager.prototype._initListeners = function () { var _this = this; this._mouseMoveListener = function (event) { return _this._onMouseMove(event); }; this._mouseUpListener = function (event) { return _this._onMouseUp(event); }; this._buffer.lines.on('trim', function (amount) { return _this._onTrim(amount); }); }; SelectionManager.prototype.disable = function () { this.clearSelection(); this._enabled = false; }; SelectionManager.prototype.enable = function () { this._enabled = true; }; SelectionManager.prototype.setBuffer = function (buffer) { this._buffer = buffer; this.clearSelection(); }; Object.defineProperty(SelectionManager.prototype, "selectionStart", { get: function () { return this._model.finalSelectionStart; }, enumerable: true, configurable: true }); Object.defineProperty(SelectionManager.prototype, "selectionEnd", { get: function () { return this._model.finalSelectionEnd; }, enumerable: true, configurable: true }); Object.defineProperty(SelectionManager.prototype, "hasSelection", { get: function () { var start = this._model.finalSelectionStart; var end = this._model.finalSelectionEnd; if (!start || !end) { return false; } return start[0] !== end[0] || start[1] !== end[1]; }, enumerable: true, configurable: true }); Object.defineProperty(SelectionManager.prototype, "selectionText", { get: function () { var start = this._model.finalSelectionStart; var end = this._model.finalSelectionEnd; if (!start || !end) { return ''; } var startRowEndCol = start[1] === end[1] ? end[0] : null; var result = []; result.push(this._buffer.translateBufferLineToString(start[1], true, start[0], startRowEndCol)); for (var i = start[1] + 1; i <= end[1] - 1; i++) { var bufferLine = this._buffer.lines.get(i); var lineText = this._buffer.translateBufferLineToString(i, true); if (bufferLine.isWrapped) { result[result.length - 1] += lineText; } else { result.push(lineText); } } if (start[1] !== end[1]) { var bufferLine = this._buffer.lines.get(end[1]); var lineText = this._buffer.translateBufferLineToString(end[1], true, 0, end[0]); if (bufferLine.isWrapped) { result[result.length - 1] += lineText; } else { result.push(lineText); } } var formattedResult = result.map(function (line) { return line.replace(ALL_NON_BREAKING_SPACE_REGEX, ' '); }).join(Browser.isMSWindows ? '\r\n' : '\n'); return formattedResult; }, enumerable: true, configurable: true }); SelectionManager.prototype.clearSelection = function () { this._model.clearSelection(); this._removeMouseDownListeners(); this.refresh(); }; SelectionManager.prototype.refresh = function (isNewSelection) { var _this = this; if (!this._refreshAnimationFrame) { this._refreshAnimationFrame = window.requestAnimationFrame(function () { return _this._refresh(); }); } if (Browser.isLinux && isNewSelection) { var selectionText = this.selectionText; if (selectionText.length) { this.emit('newselection', this.selectionText); } } }; SelectionManager.prototype._refresh = function () { this._refreshAnimationFrame = null; this.emit('refresh', { start: this._model.finalSelectionStart, end: this._model.finalSelectionEnd }); }; SelectionManager.prototype.selectAll = function () { this._model.isSelectAllActive = true; this.refresh(); }; SelectionManager.prototype._onTrim = function (amount) { var needsRefresh = this._model.onTrim(amount); if (needsRefresh) { this.refresh(); } }; SelectionManager.prototype._getMouseBufferCoords = function (event) { var coords = this._terminal.mouseHelper.getCoords(event, this._terminal.element, this._charMeasure, this._terminal.options.lineHeight, this._terminal.cols, this._terminal.rows, true); if (!coords) { return null; } coords[0]--; coords[1]--; coords[1] += this._terminal.buffer.ydisp; return coords; }; SelectionManager.prototype._getMouseEventScrollAmount = function (event) { var offset = MouseHelper_1.MouseHelper.getCoordsRelativeToElement(event, this._terminal.element)[1]; var terminalHeight = this._terminal.rows * Math.ceil(this._charMeasure.height * this._terminal.options.lineHeight); if (offset >= 0 && offset <= terminalHeight) { return 0; } if (offset > terminalHeight) { offset -= terminalHeight; } offset = Math.min(Math.max(offset, -DRAG_SCROLL_MAX_THRESHOLD), DRAG_SCROLL_MAX_THRESHOLD); offset /= DRAG_SCROLL_MAX_THRESHOLD; return (offset / Math.abs(offset)) + Math.round(offset * (DRAG_SCROLL_MAX_SPEED - 1)); }; SelectionManager.prototype.onMouseDown = function (event) { if (event.button === 2 && this.hasSelection) { return; } if (event.button !== 0) { return; } if (!this._enabled) { var shouldForceSelection = Browser.isMac ? event.altKey : event.shiftKey; if (!shouldForceSelection) { return; } event.stopPropagation(); } event.preventDefault(); this._dragScrollAmount = 0; if (this._enabled && event.shiftKey) { this._onIncrementalClick(event); } else { if (event.detail === 1) { this._onSingleClick(event); } else if (event.detail === 2) { this._onDoubleClick(event); } else if (event.detail === 3) { this._onTripleClick(event); } } this._addMouseDownListeners(); this.refresh(true); }; SelectionManager.prototype._addMouseDownListeners = function () { var _this = this; this._terminal.element.ownerDocument.addEventListener('mousemove', this._mouseMoveListener); this._terminal.element.ownerDocument.addEventListener('mouseup', this._mouseUpListener); this._dragScrollIntervalTimer = setInterval(function () { return _this._dragScroll(); }, DRAG_SCROLL_INTERVAL); }; SelectionManager.prototype._removeMouseDownListeners = function () { this._terminal.element.ownerDocument.removeEventListener('mousemove', this._mouseMoveListener); this._terminal.element.ownerDocument.removeEventListener('mouseup', this._mouseUpListener); clearInterval(this._dragScrollIntervalTimer); this._dragScrollIntervalTimer = null; }; SelectionManager.prototype._onIncrementalClick = function (event) { if (this._model.selectionStart) { this._model.selectionEnd = this._getMouseBufferCoords(event); } }; SelectionManager.prototype._onSingleClick = function (event) { this._model.selectionStartLength = 0; this._model.isSelectAllActive = false; this._activeSelectionMode = SelectionMode.NORMAL; this._model.selectionStart = this._getMouseBufferCoords(event); if (!this._model.selectionStart) { return; } this._model.selectionEnd = null; var line = this._buffer.lines.get(this._model.selectionStart[1]); if (!line) { return; } if (line.length >= this._model.selectionStart[0]) { return; } var char = line[this._model.selectionStart[0]]; if (char[Buffer_1.CHAR_DATA_WIDTH_INDEX] === 0) { this._model.selectionStart[0]++; } }; SelectionManager.prototype._onDoubleClick = function (event) { var coords = this._getMouseBufferCoords(event); if (coords) { this._activeSelectionMode = SelectionMode.WORD; this._selectWordAt(coords); } }; SelectionManager.prototype._onTripleClick = function (event) { var coords = this._getMouseBufferCoords(event); if (coords) { this._activeSelectionMode = SelectionMode.LINE; this._selectLineAt(coords[1]); } }; SelectionManager.prototype._onMouseMove = function (event) { event.stopImmediatePropagation(); var previousSelectionEnd = this._model.selectionEnd ? [this._model.selectionEnd[0], this._model.selectionEnd[1]] : null; this._model.selectionEnd = this._getMouseBufferCoords(event); if (!this._model.selectionEnd) { this.refresh(true); return; } if (this._activeSelectionMode === SelectionMode.LINE) { if (this._model.selectionEnd[1] < this._model.selectionStart[1]) { this._model.selectionEnd[0] = 0; } else { this._model.selectionEnd[0] = this._terminal.cols; } } else if (this._activeSelectionMode === SelectionMode.WORD) { this._selectToWordAt(this._model.selectionEnd); } this._dragScrollAmount = this._getMouseEventScrollAmount(event); if (this._dragScrollAmount > 0) { this._model.selectionEnd[0] = this._terminal.cols - 1; } else if (this._dragScrollAmount < 0) { this._model.selectionEnd[0] = 0; } if (this._model.selectionEnd[1] < this._buffer.lines.length) { var char = this._buffer.lines.get(this._model.selectionEnd[1])[this._model.selectionEnd[0]]; if (char && char[Buffer_1.CHAR_DATA_WIDTH_INDEX] === 0) { this._model.selectionEnd[0]++; } } if (!previousSelectionEnd || previousSelectionEnd[0] !== this._model.selectionEnd[0] || previousSelectionEnd[1] !== this._model.selectionEnd[1]) { this.refresh(true); } }; SelectionManager.prototype._dragScroll = function () { if (this._dragScrollAmount) { this._terminal.scrollDisp(this._dragScrollAmount, false); if (this._dragScrollAmount > 0) { this._model.selectionEnd = [this._terminal.cols - 1, this._terminal.buffer.ydisp + this._terminal.rows]; } else { this._model.selectionEnd = [0, this._terminal.buffer.ydisp]; } this.refresh(); } }; SelectionManager.prototype._onMouseUp = function (event) { this._removeMouseDownListeners(); }; SelectionManager.prototype._convertViewportColToCharacterIndex = function (bufferLine, coords) { var charIndex = coords[0]; for (var i = 0; coords[0] >= i; i++) { var char = bufferLine[i]; if (char[Buffer_1.CHAR_DATA_WIDTH_INDEX] === 0) { charIndex--; } } return charIndex; }; SelectionManager.prototype.setSelection = function (col, row, length) { this._model.clearSelection(); this._removeMouseDownListeners(); this._model.selectionStart = [col, row]; this._model.selectionStartLength = length; this.refresh(); }; SelectionManager.prototype._getWordAt = function (coords) { var bufferLine = this._buffer.lines.get(coords[1]); if (!bufferLine) { return null; } var line = this._buffer.translateBufferLineToString(coords[1], false); var endIndex = this._convertViewportColToCharacterIndex(bufferLine, coords); var startIndex = endIndex; var charOffset = coords[0] - startIndex; var leftWideCharCount = 0; var rightWideCharCount = 0; if (line.charAt(startIndex) === ' ') { while (startIndex > 0 && line.charAt(startIndex - 1) === ' ') { startIndex--; } while (endIndex < line.length && line.charAt(endIndex + 1) === ' ') { endIndex++; } } else { var startCol = coords[0]; var endCol = coords[0]; if (bufferLine[startCol][Buffer_1.CHAR_DATA_WIDTH_INDEX] === 0) { leftWideCharCount++; startCol--; } if (bufferLine[endCol][Buffer_1.CHAR_DATA_WIDTH_INDEX] === 2) { rightWideCharCount++; endCol++; } while (startIndex > 0 && !this._isCharWordSeparator(line.charAt(startIndex - 1))) { if (bufferLine[startCol - 1][Buffer_1.CHAR_DATA_WIDTH_INDEX] === 0) { leftWideCharCount++; startCol--; } startIndex--; startCol--; } while (endIndex + 1 < line.length && !this._isCharWordSeparator(line.charAt(endIndex + 1))) { if (bufferLine[endCol + 1][Buffer_1.CHAR_DATA_WIDTH_INDEX] === 2) { rightWideCharCount++; endCol++; } endIndex++; endCol++; } } var start = startIndex + charOffset - leftWideCharCount; var length = Math.min(endIndex - startIndex + leftWideCharCount + rightWideCharCount + 1, this._terminal.cols); return { start: start, length: length }; }; SelectionManager.prototype._selectWordAt = function (coords) { var wordPosition = this._getWordAt(coords); if (wordPosition) { this._model.selectionStart = [wordPosition.start, coords[1]]; this._model.selectionStartLength = wordPosition.length; } }; SelectionManager.prototype._selectToWordAt = function (coords) { var wordPosition = this._getWordAt(coords); if (wordPosition) { this._model.selectionEnd = [this._model.areSelectionValuesReversed() ? wordPosition.start : (wordPosition.start + wordPosition.length), coords[1]]; } }; SelectionManager.prototype._isCharWordSeparator = function (char) { return WORD_SEPARATORS.indexOf(char) >= 0; }; SelectionManager.prototype._selectLineAt = function (line) { this._model.selectionStart = [0, line]; this._model.selectionStartLength = this._terminal.cols; }; return SelectionManager; }(EventEmitter_1.EventEmitter)); exports.SelectionManager = SelectionManager; //# sourceMappingURL=SelectionManager.js.map