text-buffer
Version:
A container for large mutable strings with annotated regions
297 lines (254 loc) • 10.4 kB
JavaScript
(function() {
var CompositeDisposable, DisplayMarker, DisplayMarkerLayer, Emitter, Point, Range, ref;
ref = require('event-kit'), Emitter = ref.Emitter, CompositeDisposable = ref.CompositeDisposable;
DisplayMarker = require('./display-marker');
Range = require('./range');
Point = require('./point');
module.exports = DisplayMarkerLayer = (function() {
function DisplayMarkerLayer(displayLayer, bufferMarkerLayer, ownsBufferMarkerLayer) {
this.displayLayer = displayLayer;
this.bufferMarkerLayer = bufferMarkerLayer;
this.ownsBufferMarkerLayer = ownsBufferMarkerLayer;
this.id = this.bufferMarkerLayer.id;
this.bufferMarkerLayer.displayMarkerLayers.add(this);
this.markersById = {};
this.destroyed = false;
this.emitter = new Emitter;
this.subscriptions = new CompositeDisposable;
this.markersWithDestroyListeners = new Set;
this.subscriptions.add(this.bufferMarkerLayer.onDidUpdate(this.emitDidUpdate.bind(this)));
}
/*
Section: Lifecycle
*/
DisplayMarkerLayer.prototype.destroy = function() {
if (this.destroyed) {
return;
}
this.destroyed = true;
if (this.ownsBufferMarkerLayer) {
this.clear();
}
this.subscriptions.dispose();
this.bufferMarkerLayer.displayMarkerLayers["delete"](this);
if (this.ownsBufferMarkerLayer) {
this.bufferMarkerLayer.destroy();
}
this.displayLayer.didDestroyMarkerLayer(this.id);
this.emitter.emit('did-destroy');
return this.emitter.clear();
};
DisplayMarkerLayer.prototype.clear = function() {
return this.bufferMarkerLayer.clear();
};
DisplayMarkerLayer.prototype.didClearBufferMarkerLayer = function() {
this.markersWithDestroyListeners.forEach(function(marker) {
return marker.didDestroyBufferMarker();
});
return this.markersById = {};
};
DisplayMarkerLayer.prototype.isDestroyed = function() {
return this.destroyed;
};
/*
Section: Event Subscription
*/
DisplayMarkerLayer.prototype.onDidDestroy = function(callback) {
return this.emitter.on('did-destroy', callback);
};
DisplayMarkerLayer.prototype.onDidUpdate = function(callback) {
return this.emitter.on('did-update', callback);
};
DisplayMarkerLayer.prototype.onDidCreateMarker = function(callback) {
return this.bufferMarkerLayer.onDidCreateMarker((function(_this) {
return function(bufferMarker) {
return callback(_this.getMarker(bufferMarker.id));
};
})(this));
};
/*
Section: Marker creation
*/
DisplayMarkerLayer.prototype.markScreenRange = function(screenRange, options) {
var bufferRange;
screenRange = Range.fromObject(screenRange);
bufferRange = this.displayLayer.translateScreenRange(screenRange, options);
return this.getMarker(this.bufferMarkerLayer.markRange(bufferRange, options).id);
};
DisplayMarkerLayer.prototype.markScreenPosition = function(screenPosition, options) {
var bufferPosition;
screenPosition = Point.fromObject(screenPosition);
bufferPosition = this.displayLayer.translateScreenPosition(screenPosition, options);
return this.getMarker(this.bufferMarkerLayer.markPosition(bufferPosition, options).id);
};
DisplayMarkerLayer.prototype.markBufferRange = function(bufferRange, options) {
bufferRange = Range.fromObject(bufferRange);
return this.getMarker(this.bufferMarkerLayer.markRange(bufferRange, options).id);
};
DisplayMarkerLayer.prototype.markBufferPosition = function(bufferPosition, options) {
return this.getMarker(this.bufferMarkerLayer.markPosition(Point.fromObject(bufferPosition), options).id);
};
/*
Section: Querying
*/
DisplayMarkerLayer.prototype.getMarker = function(id) {
var bufferMarker, displayMarker;
if (displayMarker = this.markersById[id]) {
return displayMarker;
} else if (bufferMarker = this.bufferMarkerLayer.getMarker(id)) {
return this.markersById[id] = new DisplayMarker(this, bufferMarker);
}
};
DisplayMarkerLayer.prototype.getMarkers = function() {
return this.bufferMarkerLayer.getMarkers().map((function(_this) {
return function(arg) {
var id;
id = arg.id;
return _this.getMarker(id);
};
})(this));
};
DisplayMarkerLayer.prototype.getMarkerCount = function() {
return this.bufferMarkerLayer.getMarkerCount();
};
DisplayMarkerLayer.prototype.findMarkers = function(params) {
params = this.translateToBufferMarkerLayerFindParams(params);
return this.bufferMarkerLayer.findMarkers(params).map((function(_this) {
return function(stringMarker) {
return _this.getMarker(stringMarker.id);
};
})(this));
};
/*
Section: Private
*/
DisplayMarkerLayer.prototype.translateBufferPosition = function(bufferPosition, options) {
return this.displayLayer.translateBufferPosition(bufferPosition, options);
};
DisplayMarkerLayer.prototype.translateBufferRange = function(bufferRange, options) {
return this.displayLayer.translateBufferRange(bufferRange, options);
};
DisplayMarkerLayer.prototype.translateScreenPosition = function(screenPosition, options) {
return this.displayLayer.translateScreenPosition(screenPosition, options);
};
DisplayMarkerLayer.prototype.translateScreenRange = function(screenRange, options) {
return this.displayLayer.translateScreenRange(screenRange, options);
};
DisplayMarkerLayer.prototype.emitDidUpdate = function() {
return this.emitter.emit('did-update');
};
DisplayMarkerLayer.prototype.notifyObserversIfMarkerScreenPositionsChanged = function() {
var i, len, marker, ref1;
ref1 = this.getMarkers();
for (i = 0, len = ref1.length; i < len; i++) {
marker = ref1[i];
marker.notifyObservers(false);
}
};
DisplayMarkerLayer.prototype.destroyMarker = function(id) {
var marker;
if (marker = this.markersById[id]) {
return marker.didDestroyBufferMarker();
}
};
DisplayMarkerLayer.prototype.didDestroyMarker = function(marker) {
this.markersWithDestroyListeners["delete"](marker);
return delete this.markersById[marker.id];
};
DisplayMarkerLayer.prototype.translateToBufferMarkerLayerFindParams = function(params) {
var bufferMarkerLayerFindParams, endBufferPosition, endScreenRow, key, startBufferPosition, startScreenRow, value;
bufferMarkerLayerFindParams = {};
for (key in params) {
value = params[key];
switch (key) {
case 'startBufferPosition':
key = 'startPosition';
break;
case 'endBufferPosition':
key = 'endPosition';
break;
case 'startScreenPosition':
key = 'startPosition';
value = this.displayLayer.translateScreenPosition(value);
break;
case 'endScreenPosition':
key = 'endPosition';
value = this.displayLayer.translateScreenPosition(value);
break;
case 'startsInBufferRange':
key = 'startsInRange';
break;
case 'endsInBufferRange':
key = 'endsInRange';
break;
case 'startsInScreenRange':
key = 'startsInRange';
value = this.displayLayer.translateScreenRange(value);
break;
case 'endsInScreenRange':
key = 'endsInRange';
value = this.displayLayer.translateScreenRange(value);
break;
case 'startBufferRow':
key = 'startRow';
break;
case 'endBufferRow':
key = 'endRow';
break;
case 'startScreenRow':
key = 'startsInRange';
startBufferPosition = this.displayLayer.translateScreenPosition(Point(value, 0));
endBufferPosition = this.displayLayer.translateScreenPosition(Point(value, 2e308));
value = Range(startBufferPosition, endBufferPosition);
break;
case 'endScreenRow':
key = 'endsInRange';
startBufferPosition = this.displayLayer.translateScreenPosition(Point(value, 0));
endBufferPosition = this.displayLayer.translateScreenPosition(Point(value, 2e308));
value = Range(startBufferPosition, endBufferPosition);
break;
case 'intersectsBufferRowRange':
key = 'intersectsRowRange';
break;
case 'intersectsScreenRowRange':
key = 'intersectsRange';
startScreenRow = value[0], endScreenRow = value[1];
startBufferPosition = this.displayLayer.translateScreenPosition(Point(startScreenRow, 0));
endBufferPosition = this.displayLayer.translateScreenPosition(Point(endScreenRow, 2e308));
value = Range(startBufferPosition, endBufferPosition);
break;
case 'containsBufferRange':
key = 'containsRange';
break;
case 'containsScreenRange':
key = 'containsRange';
value = this.displayLayer.translateScreenRange(value);
break;
case 'containsBufferPosition':
key = 'containsPosition';
break;
case 'containsScreenPosition':
key = 'containsPosition';
value = this.displayLayer.translateScreenPosition(value);
break;
case 'containedInBufferRange':
key = 'containedInRange';
break;
case 'containedInScreenRange':
key = 'containedInRange';
value = this.displayLayer.translateScreenRange(value);
break;
case 'intersectsBufferRange':
key = 'intersectsRange';
break;
case 'intersectsScreenRange':
key = 'intersectsRange';
value = this.displayLayer.translateScreenRange(value);
}
bufferMarkerLayerFindParams[key] = value;
}
return bufferMarkerLayerFindParams;
};
return DisplayMarkerLayer;
})();
}).call(this);