/* Copyright (c) 2019 Jean-Marc VIGLINO,
released under the CeCILL-B license (French BSD license)
(http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt).
*/
import ol_control_SelectBase from './SelectBase.js'
import ol_ext_element from '../util/element.js'
/**
* A multiselect control.
* A container that manage other control Select
*
* @constructor
* @extends {ol_control_SelectBase}
* @fires select
* @param {Object=} options
* @param {string} options.className control class name
* @param {Element | undefined} options.target Specify a target if you want the control to be rendered outside of the map's viewport.
* @param {ol/source/Vector | Array
} options.source the source to search in
* @param {Array} options.controls an array of controls
*/
var ol_control_SelectMulti = class olcontrolSelectMulti extends ol_control_SelectBase {
constructor(options) {
options = options || {};
// Container
options.content = ol_ext_element.create('DIV');
var container = ol_ext_element.create('UL', {
parent: options.content
});
options.className = options.className || 'ol-select-multi';
super(options);
this._container = container;
this._controls = [];
options.controls.forEach(this.addControl.bind(this));
}
/**
* Set the map instance the control associated with.
* @param {o.Map} map The map instance.
*/
setMap(map) {
if (this.getMap()) {
this._controls.forEach(function (c) {
this.getMap().remveControl(c);
}.bind(this));
}
super.setMap(map);
if (this.getMap()) {
this._controls.forEach(function (c) {
this.getMap().addControl(c);
}.bind(this));
}
}
/** Add a new control
* @param {ol.control.SelectBase} c
*/
addControl(c) {
if (c instanceof ol_control_SelectBase) {
this._controls.push(c);
c.setTarget(ol_ext_element.create('LI', {
parent: this._container
}));
c._selectAll = true;
c._onchoice = this.doSelect.bind(this);
if (this.getMap()) {
this.getMap().addControl(c);
}
}
}
/** Get select controls
* @return {Aray}
*/
getControls() {
return this._controls;
}
/** Select features by condition
*/
doSelect() {
var features = [];
this.getSources().forEach(function (s) {
features = features.concat(s.getFeatures());
});
this._controls.forEach(function (c) {
features = c.doSelect({ features: features });
});
this.dispatchEvent({ type: "select", features: features });
return features;
}
}
export default ol_control_SelectMulti