Mercurial > pub > ImplabJs
comparison src/djol/Map.js @ 10:8705103f074f
Слияние
| author | cin |
|---|---|
| date | Mon, 21 Aug 2017 18:03:00 +0300 |
| parents | f0035923ff3e |
| children |
comparison
equal
deleted
inserted
replaced
| 9:37e9e6bbe87a | 10:8705103f074f |
|---|---|
| 1 define([ | |
| 2 "dijit/registry", | |
| 3 "dojo/_base/declare", | |
| 4 "dijit/_WidgetBase", | |
| 5 "dojo/dom-construct", | |
| 6 "./PopupContainer", | |
| 7 "dojo/_base/array", | |
| 8 "ol", | |
| 9 "ol3/listen", | |
| 10 "dojo/Deferred", | |
| 11 "implab/safe" | |
| 12 ], function (registry, declare, _WidgetBase, dom, PopupContainer, array, ol, listen, Deferred, safe) { | |
| 13 | |
| 14 return declare([_WidgetBase], { | |
| 15 popupOverlays: null, | |
| 16 olMap: null, | |
| 17 | |
| 18 _pending: null, | |
| 19 | |
| 20 constructor: function () { | |
| 21 this._pending = {}; | |
| 22 }, | |
| 23 | |
| 24 buildRendering: function () { | |
| 25 this.domNode = dom.create("div"); | |
| 26 }, | |
| 27 | |
| 28 postCreate: function () { | |
| 29 this.inherited(arguments); | |
| 30 this.popupOverlays = {}; | |
| 31 this.olMap = new ol.Map({ | |
| 32 target: this.domNode, | |
| 33 layers: this.layers, | |
| 34 view: this.view, | |
| 35 controls: this.controls || [], | |
| 36 }); | |
| 37 }, | |
| 38 | |
| 39 getProjection : function() { | |
| 40 return this.view.getProjection(); | |
| 41 }, | |
| 42 | |
| 43 addInteraction: function (value) { | |
| 44 this.olMap.addInteraction(value); | |
| 45 }, | |
| 46 | |
| 47 addLayer: function (layer) { | |
| 48 if (layer) { | |
| 49 if (layer.get("layerType") == "base") | |
| 50 this.olMap.getLayers().insertAt(0, layer); | |
| 51 else | |
| 52 this.olMap.addLayer(layer); | |
| 53 } | |
| 54 }, | |
| 55 | |
| 56 removeLayer: function(layer) { | |
| 57 this.olMap.removeLayer(layer); | |
| 58 }, | |
| 59 | |
| 60 startup: function () { | |
| 61 this.inherited(arguments); | |
| 62 | |
| 63 this.olMap.updateSize(); | |
| 64 }, | |
| 65 | |
| 66 showPopup: function (contentWidget, position, opts) { | |
| 67 // Скрыть popups указанной в opts.role роли, если (opts.hint == | |
| 68 // "replace") | |
| 69 // Если не задан opts или opta.hint скрывать все popup | |
| 70 | |
| 71 var me = this; | |
| 72 | |
| 73 if ((!opts) || (!opts.hint)) { | |
| 74 this.closeAllPopups(); | |
| 75 } else if ((opts.hint) && (opts.hint == "replace")) { | |
| 76 if (opts.role) { | |
| 77 this.closePopupsByRole(opts.role); | |
| 78 } else { | |
| 79 this.closeAllPopups(); | |
| 80 } | |
| 81 } | |
| 82 var overlay = new ol.Overlay({}); | |
| 83 | |
| 84 if (opts && (opts.role)) { | |
| 85 if (this.popupOverlays[opts.role]) { | |
| 86 this.popupOverlays[opts.role].push(overlay); | |
| 87 } else { | |
| 88 this.popupOverlays[opts.role] = [overlay]; | |
| 89 } | |
| 90 } | |
| 91 | |
| 92 // Отображение popUp start | |
| 93 this.olMap.addOverlay(overlay); | |
| 94 var popup = new PopupContainer({ | |
| 95 overlay: overlay, | |
| 96 map: this.olMap, | |
| 97 onClose: function () { | |
| 98 // registry.byNode(overlay.getElement()).destroyRecursive(); | |
| 99 array.forEach(me.popupOverlays[opts.role], function (o) { | |
| 100 if (o === overlay) { | |
| 101 var index = me.popupOverlays[opts.role].indexOf(o); | |
| 102 if (index > -1) { | |
| 103 me.popupOverlays[opts.role].splice(index, 1); | |
| 104 } | |
| 105 } | |
| 106 }); | |
| 107 } | |
| 108 }); | |
| 109 overlay.setElement(popup.domNode); | |
| 110 popup.show(contentWidget); | |
| 111 overlay.setPosition(position); | |
| 112 popup.hideOverlay(); | |
| 113 // end | |
| 114 return popup; | |
| 115 }, | |
| 116 | |
| 117 closeAllPopups: function () { | |
| 118 var overlays = this.olMap.getOverlays(); | |
| 119 overlays.forEach(function (elenemt, index) { | |
| 120 registry.byNode(elenemt.getElement()).destroyRecursive(); | |
| 121 }, this); | |
| 122 this.popupOverlays = {}; | |
| 123 }, | |
| 124 | |
| 125 closePopupsByRole: function (role) { | |
| 126 if (this.popupOverlays[role]) { | |
| 127 array.forEach(this.popupOverlays[role], function (overlay) { | |
| 128 registry.byNode(overlay.getElement()).destroyRecursive(); | |
| 129 }); | |
| 130 this.popupOverlays[role] = []; | |
| 131 } | |
| 132 }, | |
| 133 | |
| 134 /** | |
| 135 * Подписывается на событие карты | |
| 136 * | |
| 137 * @param {String} | |
| 138 * name Имя события | |
| 139 * @param {function(evt)} | |
| 140 * filter Фильтр того, что событие нужное | |
| 141 * | |
| 142 * @returns {ol.ObjectEvent | ol.MapBroeserEvent | ol.MapEvent} Событие | |
| 143 * на которое подписались. | |
| 144 */ | |
| 145 awaitMapEvent: function (name, filter) { | |
| 146 safe.argumentNotEmptyString(name, "name"); | |
| 147 var map = this.olMap, | |
| 148 handle, d, me = this; | |
| 149 | |
| 150 if (me._pending[name]) | |
| 151 throw new Error("An event is already pending: " + name); | |
| 152 | |
| 153 me._pending[name] = d = new Deferred(function () { | |
| 154 handle.remove(); | |
| 155 }); | |
| 156 | |
| 157 handle = listen.once(map, name, function (evt) { | |
| 158 if (!filter || filter(evt)) | |
| 159 d.resolve(evt); | |
| 160 }); | |
| 161 | |
| 162 return d.then(function (evt) { | |
| 163 delete me._pending[name]; | |
| 164 return evt; | |
| 165 }, function (err) { | |
| 166 delete me._pending[name]; | |
| 167 throw err; | |
| 168 }); | |
| 169 }, | |
| 170 | |
| 171 cancelPendingEvents: function () { | |
| 172 for (var name in this._pending) | |
| 173 this._pending[name].cancel(); | |
| 174 } | |
| 175 }); | |
| 176 }); |
