5 import { CharMeasure } from './utils/CharMeasure';
6 import { CircularList } from './utils/CircularList';
7 import * as Mouse from './utils/Mouse';
9 export class SelectionManager {
10 private _selectionStart: [number, number];
11 private _selectionEnd: [number, number];
13 private _buffer: CircularList<any>;
14 private _rowContainer: HTMLElement;
15 private _charMeasure: CharMeasure;
17 private _mouseMoveListener: EventListener;
19 constructor(buffer: CircularList<any>, rowContainer: HTMLElement, charMeasure: CharMeasure) {
20 this._rowContainer = rowContainer;
21 this._buffer = buffer;
22 this._charMeasure = charMeasure;
23 this._attachListeners();
26 private _attachListeners() {
27 this._mouseMoveListener = event => this._onMouseMove(<MouseEvent>event);
29 this._buffer.on('trim', amount => this._onTrim(amount));
30 this._rowContainer.addEventListener('mousedown', event => this._onMouseDown(event));
31 this._rowContainer.addEventListener('mouseup', event => this._onMouseUp(event));
34 public get selectionText(): string {
35 if (!this._selectionStart || !this._selectionEnd) {
41 private _onTrim(amount: number) {
42 // TODO: Somehow map the selection coordinates with the list that is constantly being trimmed
43 // Maybe we need an ID in the CircularList that starts from 0 for the first entry and increments
44 console.log('trimmed: ' + amount);
47 private _getMouseBufferCoords(event: MouseEvent) {
48 // TODO: Take into account the current terminal viewport when fetching coordinates
49 return Mouse.getCoords(event, this._rowContainer, this._charMeasure);
52 private _onMouseDown(event: MouseEvent) {
53 this._selectionStart = this._getMouseBufferCoords(event);
54 if (this._selectionStart) {
55 this._rowContainer.addEventListener('mousemove', this._mouseMoveListener);
59 private _onMouseMove(event: MouseEvent) {
60 this._selectionEnd = this._getMouseBufferCoords(event);
63 private _onMouseUp(event: MouseEvent) {
64 console.log('mouseup');
65 console.log('start', this._selectionStart);
66 console.log('end', this._selectionEnd);
67 if (!this._selectionStart) {
70 this._rowContainer.removeEventListener('mousemove', this._mouseMoveListener);