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 }); |