193 lines
7.3 KiB
JavaScript
193 lines
7.3 KiB
JavaScript
"use strict";
|
|
var __extends = (this && this.__extends) || (function () {
|
|
var extendStatics = function (d, b) {
|
|
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 extendStatics(d, b);
|
|
};
|
|
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 Lifecycle_1 = require("./common/Lifecycle");
|
|
var Lifecycle_2 = require("./ui/Lifecycle");
|
|
var HOVER_DURATION = 500;
|
|
var MouseZoneManager = (function (_super) {
|
|
__extends(MouseZoneManager, _super);
|
|
function MouseZoneManager(_terminal) {
|
|
var _this = _super.call(this) || this;
|
|
_this._terminal = _terminal;
|
|
_this._zones = [];
|
|
_this._areZonesActive = false;
|
|
_this._tooltipTimeout = null;
|
|
_this._currentZone = null;
|
|
_this._lastHoverCoords = [null, null];
|
|
_this.register(Lifecycle_2.addDisposableDomListener(_this._terminal.element, 'mousedown', function (e) { return _this._onMouseDown(e); }));
|
|
_this._mouseMoveListener = function (e) { return _this._onMouseMove(e); };
|
|
_this._mouseLeaveListener = function (e) { return _this._onMouseLeave(e); };
|
|
_this._clickListener = function (e) { return _this._onClick(e); };
|
|
return _this;
|
|
}
|
|
MouseZoneManager.prototype.dispose = function () {
|
|
_super.prototype.dispose.call(this);
|
|
this._deactivate();
|
|
};
|
|
MouseZoneManager.prototype.add = function (zone) {
|
|
this._zones.push(zone);
|
|
if (this._zones.length === 1) {
|
|
this._activate();
|
|
}
|
|
};
|
|
MouseZoneManager.prototype.clearAll = function (start, end) {
|
|
if (this._zones.length === 0) {
|
|
return;
|
|
}
|
|
if (!end) {
|
|
start = 0;
|
|
end = this._terminal.rows - 1;
|
|
}
|
|
for (var i = 0; i < this._zones.length; i++) {
|
|
var zone = this._zones[i];
|
|
if ((zone.y1 > start && zone.y1 <= end + 1) ||
|
|
(zone.y2 > start && zone.y2 <= end + 1) ||
|
|
(zone.y1 < start && zone.y2 > end + 1)) {
|
|
if (this._currentZone && this._currentZone === zone) {
|
|
this._currentZone.leaveCallback();
|
|
this._currentZone = null;
|
|
}
|
|
this._zones.splice(i--, 1);
|
|
}
|
|
}
|
|
if (this._zones.length === 0) {
|
|
this._deactivate();
|
|
}
|
|
};
|
|
MouseZoneManager.prototype._activate = function () {
|
|
if (!this._areZonesActive) {
|
|
this._areZonesActive = true;
|
|
this._terminal.element.addEventListener('mousemove', this._mouseMoveListener);
|
|
this._terminal.element.addEventListener('mouseleave', this._mouseLeaveListener);
|
|
this._terminal.element.addEventListener('click', this._clickListener);
|
|
}
|
|
};
|
|
MouseZoneManager.prototype._deactivate = function () {
|
|
if (this._areZonesActive) {
|
|
this._areZonesActive = false;
|
|
this._terminal.element.removeEventListener('mousemove', this._mouseMoveListener);
|
|
this._terminal.element.removeEventListener('mouseleave', this._mouseLeaveListener);
|
|
this._terminal.element.removeEventListener('click', this._clickListener);
|
|
}
|
|
};
|
|
MouseZoneManager.prototype._onMouseMove = function (e) {
|
|
if (this._lastHoverCoords[0] !== e.pageX || this._lastHoverCoords[1] !== e.pageY) {
|
|
this._onHover(e);
|
|
this._lastHoverCoords = [e.pageX, e.pageY];
|
|
}
|
|
};
|
|
MouseZoneManager.prototype._onHover = function (e) {
|
|
var _this = this;
|
|
var zone = this._findZoneEventAt(e);
|
|
if (zone === this._currentZone) {
|
|
return;
|
|
}
|
|
if (this._currentZone) {
|
|
this._currentZone.leaveCallback();
|
|
this._currentZone = null;
|
|
if (this._tooltipTimeout) {
|
|
clearTimeout(this._tooltipTimeout);
|
|
}
|
|
}
|
|
if (!zone) {
|
|
return;
|
|
}
|
|
this._currentZone = zone;
|
|
if (zone.hoverCallback) {
|
|
zone.hoverCallback(e);
|
|
}
|
|
this._tooltipTimeout = setTimeout(function () { return _this._onTooltip(e); }, HOVER_DURATION);
|
|
};
|
|
MouseZoneManager.prototype._onTooltip = function (e) {
|
|
this._tooltipTimeout = null;
|
|
var zone = this._findZoneEventAt(e);
|
|
if (zone && zone.tooltipCallback) {
|
|
zone.tooltipCallback(e);
|
|
}
|
|
};
|
|
MouseZoneManager.prototype._onMouseDown = function (e) {
|
|
this._initialSelectionLength = this._terminal.getSelection().length;
|
|
if (!this._areZonesActive) {
|
|
return;
|
|
}
|
|
var zone = this._findZoneEventAt(e);
|
|
if (zone) {
|
|
if (zone.willLinkActivate(e)) {
|
|
e.preventDefault();
|
|
e.stopImmediatePropagation();
|
|
}
|
|
}
|
|
};
|
|
MouseZoneManager.prototype._onMouseLeave = function (e) {
|
|
if (this._currentZone) {
|
|
this._currentZone.leaveCallback();
|
|
this._currentZone = null;
|
|
if (this._tooltipTimeout) {
|
|
clearTimeout(this._tooltipTimeout);
|
|
}
|
|
}
|
|
};
|
|
MouseZoneManager.prototype._onClick = function (e) {
|
|
var zone = this._findZoneEventAt(e);
|
|
var currentSelectionLength = this._terminal.getSelection().length;
|
|
if (zone && currentSelectionLength === this._initialSelectionLength) {
|
|
zone.clickCallback(e);
|
|
e.preventDefault();
|
|
e.stopImmediatePropagation();
|
|
}
|
|
};
|
|
MouseZoneManager.prototype._findZoneEventAt = function (e) {
|
|
var coords = this._terminal.mouseHelper.getCoords(e, this._terminal.screenElement, this._terminal.charMeasure, this._terminal.cols, this._terminal.rows);
|
|
if (!coords) {
|
|
return null;
|
|
}
|
|
var x = coords[0];
|
|
var y = coords[1];
|
|
for (var i = 0; i < this._zones.length; i++) {
|
|
var zone = this._zones[i];
|
|
if (zone.y1 === zone.y2) {
|
|
if (y === zone.y1 && x >= zone.x1 && x < zone.x2) {
|
|
return zone;
|
|
}
|
|
}
|
|
else {
|
|
if ((y === zone.y1 && x >= zone.x1) ||
|
|
(y === zone.y2 && x < zone.x2) ||
|
|
(y > zone.y1 && y < zone.y2)) {
|
|
return zone;
|
|
}
|
|
}
|
|
}
|
|
return null;
|
|
};
|
|
return MouseZoneManager;
|
|
}(Lifecycle_1.Disposable));
|
|
exports.MouseZoneManager = MouseZoneManager;
|
|
var MouseZone = (function () {
|
|
function MouseZone(x1, y1, x2, y2, clickCallback, hoverCallback, tooltipCallback, leaveCallback, willLinkActivate) {
|
|
this.x1 = x1;
|
|
this.y1 = y1;
|
|
this.x2 = x2;
|
|
this.y2 = y2;
|
|
this.clickCallback = clickCallback;
|
|
this.hoverCallback = hoverCallback;
|
|
this.tooltipCallback = tooltipCallback;
|
|
this.leaveCallback = leaveCallback;
|
|
this.willLinkActivate = willLinkActivate;
|
|
}
|
|
return MouseZone;
|
|
}());
|
|
exports.MouseZone = MouseZone;
|
|
//# sourceMappingURL=MouseZoneManager.js.map
|