import { isArrayHasData } from '../core/util'; import { stringLength } from '../core/util/strings'; import { on, createEl, addClass, stopPropagation, measureDom, isHTML } from '../core/util/dom'; import Control, { ControlOptionsType } from './Control'; import type { Map } from './../map/Map'; /** * @property {Object} options - options * @property {String|Object} [options.position="top-right"] - position of the toolbar control. * @property {Boolean} [options.vertical=true] - Whether the toolbar is a vertical one. * @property {Boolean} [options.reverseMenu=false] - Whether to reverse direction of drop menu. * @property {Object[]} options.items - items on the toolbar. 'item':content of button,support HTML.'height': height in pixels,'click':click function,'children': displayed menus by hovering * @memberOf control.Toolbar * @instance */ const options: ToolbarOptionsType = { 'height': 28, 'vertical': false, 'position': 'top-right', 'reverseMenu': false, 'items': [] //default buttons }; /** * @classdesc * A toolbar control of the map. * @category control * @extends control.Control * @memberOf control * @example * var toolbar = new Toolbar({ * position : 'top-right', * items: [ * { * item: 'item1', * click: function () { * alert('item1 clicked'); * } * }, * { * item: 'item2', * click: function () { * alert('item2 clicked'); * } * } * ] * }).addTo(map); */ class Toolbar extends Control { options: ToolbarOptionsType; /** * method to build DOM of the control * @param {Map} map map to build on * @return {HTMLDOMElement} */ buildOn(map: Map) { this._map = map; const dom = createEl('div'); const ul = createEl('ul', 'maptalks-toolbar-hx'); dom.appendChild(ul); if (this.options['vertical']) { addClass(dom, 'maptalks-toolbar-vertical'); } else { addClass(dom, 'maptalks-toolbar-horizonal'); } const me = this; function onButtonClick(fn, index, childIndex, targetDom) { const item = me._getItems()[index]; return function (e) { stopPropagation(e); return fn({ 'target': item, 'index': index, 'childIndex': childIndex, 'dom': targetDom }); }; } const items = this.options['items']; if (isArrayHasData(items)) { for (let i = 0, len = items.length; i < len; i++) { const item = items[i]; const li = createEl('li'); if (this.options['height'] !== 28) { li.style.lineHeight = this.options['height'] + 'px'; } li.style.height = this.options['height'] + 'px'; li.style.cursor = 'pointer'; if (isHTML(item['item'])) { li.style.textAlign = 'center'; const itemSize = measureDom('div', item['item']); //vertical-middle li.innerHTML = '