goog.provide('M.Control');
goog.require('M.utils');
goog.require('M.exception');
goog.require('M.facade.Base');
(function () {
/**
* @classdesc
* Main constructor of the class. Creates a layer
* with parameters specified by the user
*
* @constructor
* @extends {M.facade.Base}
* @api stable
*/
M.Control = (function (impl, name) {
// checks if the implementation can create WMC layers
if (M.utils.isUndefined(impl.addTo)) {
M.exception('La implementación usada no posee el método addTo');
}
// checks if the implementation can create WMC layers
if (M.utils.isUndefined(impl.getElement)) {
M.exception('La implementación usada no posee el método getElement');
}
// checks if the implementation can create default controls
if (M.utils.isUndefined(impl.isByDefault)) {
impl.isByDefault = true;
}
/**
* @public
* @type {string}
* @api stable
* @expose
*/
this.name = name;
/**
* @private
* @type {M.Map}
* @expose
*/
this.map_ = null;
/**
* @private
* @type {HTMLElement}
* @expose
*/
this.element_ = null;
/**
* @private
* @type {HTMLElement}
* @expose
*/
this.activationBtn_ = null;
/**
* @public
* @type {boolean}
* @api stable
* @expose
*/
this.activated = false;
/**
* @private
* @type {M.ui.Panel}
* @expose
*/
this.panel_ = null;
// calls the super constructor
goog.base(this, impl);
});
goog.inherits(M.Control, M.facade.Base);
/**
* This function set implementation of this control
*
* @public
* @function
* @param {M.Map} impl to add the plugin
* @api stable
*/
M.Control.prototype.setImpl = function (impl) {
// checks if the implementation can create WMC layers
if (M.utils.isUndefined(impl.addTo)) {
M.exception('La implementación usada no posee el método addTo');
}
if (M.utils.isUndefined(impl.getElement)) {
M.exception('La implementación usada no posee el método getElement');
}
// checks if the implementation can create default controls
if (M.utils.isUndefined(impl.isByDefault)) {
impl.isByDefault = true;
}
goog.base(this, 'setImpl', impl);
};
/**
* This function adds the control to the specified map
*
* @public
* @function
* @param {M.Map} map to add the plugin
* @api stable
* @export
*/
M.Control.prototype.addTo = function (map) {
this.map_ = map;
var impl = this.getImpl();
var view = this.createView(map);
if (view instanceof Promise) { // the view is a promise
var this_ = this;
view.then(function (html) {
this_.manageActivation(html);
impl.addTo(map, html);
this_.fire(M.evt.ADDED_TO_MAP);
});
}
else { // view is an HTML or text or null
this.manageActivation(view);
impl.addTo(map, view);
this.fire(M.evt.ADDED_TO_MAP);
}
};
/**
* This function creates the HTML view for this control
* @public
* @function
* @param {M.Map} map to add the plugin
* @api stable
* @export
*/
M.Control.prototype.createView = function (map) {};
/**
* TODO
*
* @public
* @function
* @param {HTMLElement} html to add the plugin
* @api stable
* @export
*/
M.Control.prototype.manageActivation = function (html) {
this.element_ = html;
this.activationBtn_ = this.getActivationButton(this.element_);
if (!M.utils.isNullOrEmpty(this.activationBtn_)) {
goog.events.listen(this.activationBtn_, goog.events.EventType.CLICK, function (evt) {
evt.preventDefault();
if (!this.activated) {
this.activate();
this.activated = true;
}
else {
this.deactivate();
this.activated = false;
}
}, false, this);
}
};
/**
* TODO
*
* @public
* @function
* @param {HTMLElement} html to add the plugin
* @api stable
* @export
*/
M.Control.prototype.getActivationButton = function (html) {};
/**
* function adds the event 'click'
*
* @public
* @function
* @api stable
* @export
*/
M.Control.prototype.activate = function () {
if (!M.utils.isNullOrEmpty(this.element_)) {
goog.dom.classlist.add(this.element_, 'activated');
}
if (!M.utils.isUndefined(this.getImpl().activate)) {
this.getImpl().activate();
}
this.activated = true;
this.fire(M.evt.ACTIVATED);
};
/**
* function remove the event 'click'
*
* @public
* @function
* @api stable
* @export
*/
M.Control.prototype.deactivate = function () {
if (!M.utils.isNullOrEmpty(this.element_)) {
goog.dom.classlist.remove(this.element_, 'activated');
}
if (!M.utils.isUndefined(this.getImpl().deactivate)) {
this.getImpl().deactivate();
}
this.activated = false;
this.fire(M.evt.DEACTIVATED);
};
/**
* function remove the event 'click'
*
* @public
* @function
* @api stable
* @export
*/
M.Control.prototype.getElement = function () {
return this.getImpl().getElement();
};
/**
* Sets the panel of the control
*
* @public
* @function
* @param {M.ui.Panel} panel
* @api stable
* @export
*/
M.Control.prototype.setPanel = function (panel) {
this.panel_ = panel;
};
/**
* Gets the panel of the control
*
* @public
* @function
* @returns {M.ui.Panel}
* @api stable
* @export
*/
M.Control.prototype.getPanel = function () {
return this.panel_;
};
/**
* Destroys the control
*
* @public
* @function
* @api stable
* @export
*/
M.Control.prototype.destroy = function () {
// this.getImpl().destroy();
// this.fire(M.evt.DESTROY);
};
})();