Files
openlayers/src/ol/control/selectcontrol.js

154 lines
4.0 KiB
JavaScript

goog.provide('ol.control.Select');
goog.require('goog.array');
goog.require('goog.dom');
goog.require('goog.dom.TagName');
goog.require('goog.dom.classes');
goog.require('goog.events');
goog.require('goog.events.EventType');
goog.require('ol.MapBrowserEvent.EventType');
goog.require('ol.control.Control');
goog.require('ol.css');
goog.require('ol.interaction.condition');
goog.require('ol.layer.Vector');
goog.require('ol.source.Vector');
/**
* @constructor
* @extends {ol.control.Control}
* @param {ol.control.SelectOptions=} opt_options Options.
*/
ol.control.Select = function(opt_options) {
var options = goog.isDef(opt_options) ? opt_options : {};
this.layer = new ol.layer.Vector({
source: new ol.source.Vector({parser: null}),
temp: true
});
this.layers_ = options.layers;
// TODO: css
var className = goog.isDef(options.className) ? options.className :
'ol-select';
var element = goog.dom.createDom(goog.dom.TagName.DIV, {
'class': className + ' ' + ol.css.CLASS_UNSELECTABLE
});
var button = goog.dom.createDom(goog.dom.TagName.A, {
'href': '#Select'
});
goog.dom.appendChild(element, button);
goog.events.listen(element, [
goog.events.EventType.TOUCHEND,
goog.events.EventType.CLICK
], this.toggleActive_, false, this);
goog.base(this, {
element: element,
map: options.map,
target: options.target
});
};
goog.inherits(ol.control.Select, ol.control.Control);
/**
* @param {goog.events.BrowserEvent} browserEvent Browser event.
* @private
*/
ol.control.Select.prototype.toggleActive_ = function(browserEvent) {
// prevent #Select anchor from getting appended to the url
browserEvent.preventDefault();
if (this.active_) {
this.deactivate();
} else {
this.activate();
}
};
/**
* Activate the control.
*/
ol.control.Select.prototype.activate = function() {
goog.dom.classes.add(this.element, 'active');
this.getMap().addLayer(this.layer);
// TODO: Implement box selection
this.listenerKeys.push(
goog.events.listen(this.getMap(), ol.MapBrowserEvent.EventType.CLICK,
this.handleClick, true, this));
};
/**
* Dectivate the control.
*/
ol.control.Select.prototype.deactivate = function() {
if (!goog.array.isEmpty(this.listenerKeys)) {
goog.array.forEach(this.listenerKeys, goog.events.unlistenByKey);
this.listenerKeys.length = 0;
}
this.getMap().removeLayer(this.layer);
goog.dom.classes.remove(this.element, 'active');
};
/**
* @param {ol.MapBrowserEvent} evt Event.
*/
ol.control.Select.prototype.handleClick = function(evt) {
var clear = true;
if (ol.interaction.condition.shiftKeyOnly(evt.browserEvent)) {
clear = false;
}
function select(featuresByLayer) {
this.select(featuresByLayer, clear);
}
this.getMap().getFeatures({
layers: this.layers_,
pixel: evt.getPixel(),
success: goog.bind(select, this)
});
};
/**
* @param {Array.<Array.<ol.Feature>>} featuresByLayer Features by layer.
* @param {boolean} clear Whether the current layer content should be cleared.
*/
ol.control.Select.prototype.select = function(featuresByLayer, clear) {
for (var i = 0, ii = featuresByLayer.length; i < ii; ++i) {
var features = featuresByLayer[i];
var numFeatures = features.length;
var selectedFeatures = [];
var unselectedFeatures = [];
for (var j = 0; j < numFeatures; ++j) {
var feature = features[j];
var selectedFeature = this.layer.getFeatureWithUid(goog.getUid(feature));
if (selectedFeature) {
// TODO: make toggle configurable
unselectedFeatures.push(selectedFeature);
} else {
selectedFeatures.push(feature);
}
}
var layer = this.layers_[i];
if (goog.isFunction(layer.setRenderIntent)) {
// TODO: Implement setRenderIntent for ol.layer.Vector
layer.setRenderIntent('hidden', selectedFeatures);
layer.setRenderIntent('default', unselectedFeatures);
}
if (clear) {
this.layer.clear();
}
this.layer.removeFeatures(unselectedFeatures);
this.layer.addFeatures(selectedFeatures);
}
};