Mercurial > pub > ImplabJs
comparison src/djol/IdentificationTool.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/layout/ContentPane", | |
3 "dojo/_base/declare", | |
4 "dojo/Deferred", | |
5 "dojo/dom-construct", | |
6 "dojo/dom-class", | |
7 "dojo/on", | |
8 "dojo/promise/all", | |
9 "dojo/when", | |
10 "implab/safe", | |
11 "ol", | |
12 "./listen", | |
13 "./IdentifyGroup", | |
14 "./_ToolBase", | |
15 "./PopupContainer" | |
16 ], | |
17 | |
18 function ( | |
19 ContentPane, | |
20 declare, | |
21 Deffered, | |
22 domConstruct, | |
23 domClass, | |
24 on, | |
25 promiseAll, | |
26 when, | |
27 safe, | |
28 ol, | |
29 listen, | |
30 IdentifyGroup, | |
31 _ToolBase, | |
32 PopupContainer) { | |
33 return declare([_ToolBase], { | |
34 /** | |
35 * массив обработчиков openLayers, которые необходимо удалить при | |
36 * деактивации | |
37 */ | |
38 _handlers: null, | |
39 /** | |
40 * widget карты | |
41 */ | |
42 _map: null, | |
43 /** | |
44 * openLayers map | |
45 */ | |
46 _olMap: null, | |
47 /** | |
48 * Массив overlays содержащих popupContainers | |
49 */ | |
50 _popupOverlays: null, | |
51 /** | |
52 * Массив popups контейнеров | |
53 */ | |
54 _popupContainers: null, | |
55 /** | |
56 * Режим работы инструмента идентификации | |
57 * | |
58 * @value {String} "single"||"multiple" | |
59 */ | |
60 mode: null, | |
61 /** | |
62 * Режимы | |
63 */ | |
64 appManager: null, | |
65 | |
66 constructor: function (options) { | |
67 safe.argumentNotNull(options, "options"); | |
68 safe.argumentNotNull(options.map, "options.map"); | |
69 safe.argumentNotNull(options.appManager, "options.appManager"); | |
70 | |
71 this._map = options.map; | |
72 this._olMap = options.map.olMap; | |
73 this._popupContainers = []; | |
74 this._popupOverlays = []; | |
75 this._handlers = []; | |
76 | |
77 this.appManager = options.appManager; | |
78 this.mode = options.mode || "single"; | |
79 }, | |
80 /** | |
81 */ | |
82 createPopupContent: function (groupWidgets) { | |
83 var contentWidget = new ContentPane(); | |
84 groupWidgets.forEach(function (groupWidget) { | |
85 if (groupWidget && !groupWidget.isEmpty()) { | |
86 contentWidget.addChild(groupWidget); | |
87 } | |
88 }); | |
89 return contentWidget; | |
90 }, | |
91 | |
92 /** | |
93 * Возвращает обещание на получение объекта с результатом идентификации | |
94 * по всем видимым режимам и информационным слоям @ options {Object} @ pixel | |
95 * {Object} - информация о точке идентификации @ coordinate {Array} - | |
96 * координаты точки иденификации | |
97 */ | |
98 getGroupsFromVisibleModules: function (options) { | |
99 var promises = []; | |
100 var modules = this.appManager.getVisibleModules(); | |
101 modules.forEach(function (module) { | |
102 promises.push.apply(promises, module | |
103 .getIdentifyResult(options)); | |
104 }); | |
105 | |
106 return promiseAll(promises).then( | |
107 function (results) { | |
108 console.log("promise all groups = ", results); | |
109 return results; | |
110 }); | |
111 }, | |
112 | |
113 identifyPosition: function (position) { | |
114 var me = this, i; | |
115 var popupContainer = null, | |
116 popupOverlay = null; | |
117 if (me.mode == "multiple") { | |
118 // TODO: создать popupContainer и popupOverlay | |
119 popupContainer = new PopupContainer({ | |
120 map: me._olMap | |
121 }); | |
122 on(popupContainer, "close", function () { | |
123 var index = me._popupContainers.indexOf(me); | |
124 me._popupContainers.splice(index, 1); | |
125 | |
126 }); | |
127 me._popupContainers.push(popupContainer); | |
128 | |
129 popupOverlay = new ol.Overlay({ | |
130 element: popupContainer.domNode, | |
131 autoPan: true, | |
132 autoPanAnimation: { | |
133 duration: 250 | |
134 } | |
135 }); | |
136 me._popupOverlays.push(popupOverlay); | |
137 me._olMap.addOverlay(popupOverlay); | |
138 | |
139 } else { | |
140 if (me._popupContainers.length > 0) { | |
141 // Берем первый | |
142 popupContainer = me._popupContainers[0]; | |
143 // Все остальные удалить | |
144 if (me._popupContainers.length > 1) { | |
145 for (i = 1; i < me._popupContainers.length; i++) { | |
146 me._popupContainers[i].destroyRecursive(); | |
147 } | |
148 me._popupContainers.splice( | |
149 1, | |
150 me._popupContainers.length - 1); | |
151 } | |
152 } else { | |
153 // Создаем новый | |
154 popupContainer = new PopupContainer({ | |
155 map: me._olMap | |
156 }); | |
157 on(popupContainer, "close", function () { | |
158 var index = me._popupContainers.indexOf(me); | |
159 me._popupContainers.splice(index, 1); | |
160 | |
161 }); | |
162 me._popupContainers.push(popupContainer); | |
163 } | |
164 if (me._popupOverlays.length > 0) { | |
165 // Берем первый и помещаем в него popup | |
166 popupOverlay = me._popupOverlays[0]; | |
167 popupOverlay.setElement(popupContainer.domNode); | |
168 // Все остальные удалить | |
169 if (me._popupOverlays.length > 1) { | |
170 for (i = 1; i < me._popupOverlays.length; i++) { | |
171 me._olMap.removeOverlay(me._popupOverlays[i]); | |
172 } | |
173 me._popupOverlays.splice( | |
174 1, | |
175 me._popupOverlays.length - 1) | |
176 } | |
177 } else { | |
178 // Создаем новый и помещаем в него popup | |
179 popupOverlay = new ol.Overlay({ | |
180 element: popupContainer.domNode, | |
181 autoPan: true, | |
182 autoPanAnimation: { | |
183 duration: 250 | |
184 } | |
185 }); | |
186 me._popupOverlays.push(popupOverlay); | |
187 me._olMap.addOverlay(popupOverlay); | |
188 } | |
189 } | |
190 | |
191 popupContainer.destroyDescendants(); | |
192 | |
193 popupOverlay.setPosition(position.coordinate); | |
194 | |
195 popupContainer.showOverlay(); | |
196 | |
197 when(me.getGroupsFromVisibleModules(position), function (data) { | |
198 var contentWidget = me.createPopupContent(data); | |
199 popupContainer.show(contentWidget, "only"); | |
200 popupContainer.hideOverlay(); | |
201 }); | |
202 }, | |
203 /** | |
204 * Скрыть все popups | |
205 */ | |
206 hideAllPopups: function () { | |
207 var me = this, i; | |
208 for (i = 0; i < this._popupContainers.length; i++) { | |
209 this._popupContainers[i].destroyRecursive(); | |
210 } | |
211 this._popupContainers.splice(0, this._popupContainers.length); | |
212 | |
213 for (i = 0; i < this._popupOverlays.length; i++) { | |
214 this._olMap.removeOverlay(this._popupOverlays[i]); | |
215 } | |
216 this._popupOverlays.splice(0, this._popupOverlays.length) | |
217 }, | |
218 | |
219 onActivating: function () { | |
220 var me = this; | |
221 // Обработчик для события "singleclick" по карте | |
222 var handler = listen(this._olMap, 'singleclick', function (evt) { | |
223 if (evt.originalEvent.ctrlKey) { | |
224 me.mode = "multiple"; | |
225 } else { | |
226 me.mode = "single"; | |
227 } | |
228 me.identifyPosition({ | |
229 pixel: evt.pixel, | |
230 coordinate: evt.coordinate | |
231 }); | |
232 }); | |
233 this._handlers.push(handler); | |
234 }, | |
235 | |
236 onDeactivating: function () { | |
237 var me = this; | |
238 me._handlers.forEach(function (handler) { | |
239 if (handler.remove) | |
240 handler.remove(); | |
241 | |
242 }); | |
243 this.hideAllPopups(); | |
244 }, | |
245 }) | |
246 }); |