OLD | NEW |
1 <!-- Copyright (c) 2015 Google Inc. All rights reserved. --> | 1 <!-- Copyright (c) 2015 Google Inc. All rights reserved. --> |
2 | 2 |
3 <link rel="import" href="../polymer/polymer.html"> | 3 <link rel="import" href="../polymer/polymer.html"> |
4 <link rel="import" href="../google-apis/google-maps-api.html"> | 4 <link rel="import" href="../google-apis/google-maps-api.html"> |
5 | 5 |
6 <!-- | 6 <!-- |
7 The `google-map-marker` element represents a map marker. It is used as a | 7 The `google-map-marker` element represents a map marker. It is used as a |
8 child of `google-map`. | 8 child of `google-map`. |
9 | 9 |
10 <b>Example</b>: | 10 <b>Example</b>: |
(...skipping 24 matching lines...) Expand all Loading... |
35 <dom-module id="google-map-marker"> | 35 <dom-module id="google-map-marker"> |
36 <style> | 36 <style> |
37 :host { | 37 :host { |
38 display: none; | 38 display: none; |
39 } | 39 } |
40 </style> | 40 </style> |
41 <template><content></content></template> | 41 <template><content></content></template> |
42 </dom-module> | 42 </dom-module> |
43 | 43 |
44 <script> | 44 <script> |
| 45 (function() { |
45 | 46 |
46 (function() { | 47 function setupDragHandler_() { |
| 48 if (this.draggable) { |
| 49 this.dragHandler_ = google.maps.event.addListener( |
| 50 this.marker, 'dragend', onDragEnd_.bind(this)); |
| 51 } else { |
| 52 google.maps.event.removeListener(this.dragHandler_); |
| 53 this.dragHandler_ = null; |
| 54 } |
| 55 } |
| 56 |
| 57 function onDragEnd_(e, details, sender) { |
| 58 this.latitude = e.latLng.lat(); |
| 59 this.longitude = e.latLng.lng(); |
| 60 } |
| 61 |
47 Polymer({ | 62 Polymer({ |
48 | 63 |
49 is: 'google-map-marker', | 64 is: 'google-map-marker', |
50 | 65 |
51 /** | 66 /** |
52 * Fired when the marker icon was clicked. Requires the clickEvents attribut
e to be true. | 67 * Fired when the marker icon was clicked. Requires the clickEvents attribut
e to be true. |
53 * @param {google.maps.MouseEvent} event The mouse event. | 68 * @param {google.maps.MouseEvent} event The mouse event. |
54 * @event google-map-marker-click | 69 * @event google-map-marker-click |
55 */ | 70 */ |
| 71 |
56 /** | 72 /** |
57 * Fired when the marker icon was double clicked. Requires the clickEvents a
ttribute to be true. | 73 * Fired when the marker icon was double clicked. Requires the clickEvents a
ttribute to be true. |
58 * @param {google.maps.MouseEvent} event The mouse event. | 74 * @param {google.maps.MouseEvent} event The mouse event. |
59 * @event google-map-marker-dblclick | 75 * @event google-map-marker-dblclick |
60 */ | 76 */ |
| 77 |
61 /** | 78 /** |
62 * Fired for a mousedown on the marker. Requires the mouseEvents attribute t
o be true. | 79 * Fired for a mousedown on the marker. Requires the mouseEvents attribute t
o be true. |
63 * @event google-map-marker-mousedown | 80 * @event google-map-marker-mousedown |
64 * @param {google.maps.MouseEvent} event The mouse event. | 81 * @param {google.maps.MouseEvent} event The mouse event. |
65 */ | 82 */ |
| 83 |
66 /** | 84 /** |
67 * Fired when the DOM `mousemove` event is fired on the marker. Requires the
mouseEvents | 85 * Fired when the DOM `mousemove` event is fired on the marker. Requires the
mouseEvents |
68 * attribute to be true. | 86 * attribute to be true. |
69 * @event google-map-marker-mousemove | 87 * @event google-map-marker-mousemove |
70 * @param {google.maps.MouseEvent} event The mouse event. | 88 * @param {google.maps.MouseEvent} event The mouse event. |
71 */ | 89 */ |
| 90 |
72 /** | 91 /** |
73 * Fired when the mouse leaves the area of the marker icon. Requires the mou
seEvents attribute to be | 92 * Fired when the mouse leaves the area of the marker icon. Requires the mou
seEvents attribute to be |
74 * true. | 93 * true. |
75 * @event google-map-marker-mouseout | 94 * @event google-map-marker-mouseout |
76 * @param {google.maps.MouseEvent} event The mouse event. | 95 * @param {google.maps.MouseEvent} event The mouse event. |
77 */ | 96 */ |
| 97 |
78 /** | 98 /** |
79 * Fired when the mouse enters the area of the marker icon. Requires the mou
seEvents attribute to be | 99 * Fired when the mouse enters the area of the marker icon. Requires the mou
seEvents attribute to be |
80 * true. | 100 * true. |
81 * @event google-map-marker-mouseover | 101 * @event google-map-marker-mouseover |
82 * @param {google.maps.MouseEvent} event The mouse event. | 102 * @param {google.maps.MouseEvent} event The mouse event. |
83 */ | 103 */ |
| 104 |
84 /** | 105 /** |
85 * Fired for a mouseup on the marker. Requires the mouseEvents attribute to
be true. | 106 * Fired for a mouseup on the marker. Requires the mouseEvents attribute to
be true. |
86 * | 107 * |
87 * @event google-map-marker-mouseup | 108 * @event google-map-marker-mouseup |
88 * @param {google.maps.MouseEvent} event The mouse event. | 109 * @param {google.maps.MouseEvent} event The mouse event. |
89 */ | 110 */ |
| 111 |
90 /** | 112 /** |
91 * Fired for a rightclick on the marker. Requires the clickEvents attribute
to be true. | 113 * Fired for a rightclick on the marker. Requires the clickEvents attribute
to be true. |
92 * @event google-map-marker-rightclick | 114 * @event google-map-marker-rightclick |
93 * @param {google.maps.MouseEvent} event The mouse event. | 115 * @param {google.maps.MouseEvent} event The mouse event. |
94 */ | 116 */ |
| 117 |
| 118 /** |
| 119 * Fired when an infowindow is opened. |
| 120 * @event google-map-marker-open |
| 121 */ |
| 122 |
| 123 /** |
| 124 * Fired when the close button of the infowindow is pressed. |
| 125 * @event google-map-marker-close |
| 126 */ |
| 127 |
95 properties: { | 128 properties: { |
96 /** | 129 /** |
97 * A Google Maps marker object. | 130 * A Google Maps marker object. |
98 * @type google.maps.Marker | 131 * @type google.maps.Marker |
99 */ | 132 */ |
100 marker: Object, | 133 marker: Object, |
101 | 134 |
102 /** | 135 /** |
103 * The Google map object. | 136 * The Google map object. |
104 * @type google.maps.Map | 137 * @type google.maps.Map |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
154 }, | 187 }, |
155 | 188 |
156 /** | 189 /** |
157 * The marker's longitude coordinate. | 190 * The marker's longitude coordinate. |
158 */ | 191 */ |
159 longitude: { | 192 longitude: { |
160 type: Number, | 193 type: Number, |
161 value: null, | 194 value: null, |
162 reflectToAttribute: true | 195 reflectToAttribute: true |
163 }, | 196 }, |
| 197 |
164 /** | 198 /** |
165 * The marker's latitude coordinate. | 199 * The marker's latitude coordinate. |
166 */ | 200 */ |
167 latitude: { | 201 latitude: { |
168 type: Number, | 202 type: Number, |
169 value: null, | 203 value: null, |
170 reflectToAttribute: true | 204 reflectToAttribute: true |
| 205 }, |
| 206 |
| 207 /** |
| 208 * A animation for the marker. "DROP" or "BOUNCE". See |
| 209 * https://developers.google.com/maps/documentation/javascript/examples/ma
rker-animations. |
| 210 */ |
| 211 animation: { |
| 212 type: String, |
| 213 value: null, |
| 214 observer: '_animationChanged' |
| 215 }, |
| 216 |
| 217 /** |
| 218 * Specifies whether the InfoWindow is open or not |
| 219 */ |
| 220 open: { |
| 221 type: Boolean, |
| 222 value: false, |
| 223 observer: '_openChanged' |
171 } | 224 } |
172 }, | 225 }, |
173 | 226 |
174 observers: [ | 227 observers: [ |
175 '_updatePosition(latitude, longitude)' | 228 '_updatePosition(latitude, longitude)' |
176 ], | 229 ], |
177 | 230 |
178 detached: function() { | 231 detached: function() { |
179 if (this.marker) { | 232 if (this.marker) { |
180 this.marker.setMap(null); | 233 this.marker.setMap(null); |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
224 } else { | 277 } else { |
225 this._clearListener('mousedown'); | 278 this._clearListener('mousedown'); |
226 this._clearListener('mousemove'); | 279 this._clearListener('mousemove'); |
227 this._clearListener('mouseout'); | 280 this._clearListener('mouseout'); |
228 this._clearListener('mouseover'); | 281 this._clearListener('mouseover'); |
229 this._clearListener('mouseup'); | 282 this._clearListener('mouseup'); |
230 } | 283 } |
231 } | 284 } |
232 }, | 285 }, |
233 | 286 |
| 287 _animationChanged: function() { |
| 288 if (this.marker) { |
| 289 this.marker.setAnimation(google.maps.Animation[this.animation]); |
| 290 } |
| 291 }, |
| 292 |
234 _iconChanged: function() { | 293 _iconChanged: function() { |
235 if (this.marker) { | 294 if (this.marker) { |
236 this.marker.setIcon(this.icon); | 295 this.marker.setIcon(this.icon); |
237 } | 296 } |
238 }, | 297 }, |
239 | 298 |
240 _zIndexChanged: function() { | 299 _zIndexChanged: function() { |
241 if (this.marker) { | 300 if (this.marker) { |
242 this.marker.setZIndex(this.zIndex); | 301 this.marker.setZIndex(this.zIndex); |
243 } | 302 } |
(...skipping 19 matching lines...) Expand all Loading... |
263 this._contentObserver.observe( this, { | 322 this._contentObserver.observe( this, { |
264 childList: true, | 323 childList: true, |
265 subtree: true | 324 subtree: true |
266 }); | 325 }); |
267 | 326 |
268 var content = this.innerHTML.trim(); | 327 var content = this.innerHTML.trim(); |
269 if (content) { | 328 if (content) { |
270 if (!this.info) { | 329 if (!this.info) { |
271 // Create a new infowindow | 330 // Create a new infowindow |
272 this.info = new google.maps.InfoWindow(); | 331 this.info = new google.maps.InfoWindow(); |
273 this.infoHandler_ = google.maps.event.addListener(this.marker, 'click'
, function() { | 332 this.openInfoHandler_ = google.maps.event.addListener(this.marker, 'cl
ick', function() { |
274 this.info.open(this.map, this.marker); | 333 this.open = true; |
| 334 }.bind(this)); |
| 335 |
| 336 this.closeInfoHandler_ = google.maps.event.addListener(this.info, 'clo
seclick', function() { |
| 337 this.open = false; |
275 }.bind(this)); | 338 }.bind(this)); |
276 } | 339 } |
277 this.info.setContent(content); | 340 this.info.setContent(content); |
278 } else { | 341 } else { |
279 if (this.info) { | 342 if (this.info) { |
280 // Destroy the existing infowindow. It doesn't make sense to have an
empty one. | 343 // Destroy the existing infowindow. It doesn't make sense to have an
empty one. |
281 google.maps.event.removeListener(this.infoHandler_); | 344 google.maps.event.removeListener(this.openInfoHandler_); |
| 345 google.maps.event.removeListener(this.closeInfoHandler_); |
282 this.info = null; | 346 this.info = null; |
283 } | 347 } |
284 } | 348 } |
285 }, | 349 }, |
286 | 350 |
| 351 _openChanged: function() { |
| 352 if (this.info) { |
| 353 if (this.open) { |
| 354 this.info.open(this.map, this.marker); |
| 355 this.fire('google-map-marker-open'); |
| 356 } else { |
| 357 this.info.close(); |
| 358 this.fire('google-map-marker-close'); |
| 359 } |
| 360 } |
| 361 }, |
| 362 |
287 _mapReady: function() { | 363 _mapReady: function() { |
288 this._listeners = {}; | 364 this._listeners = {}; |
289 this.marker = new google.maps.Marker({ | 365 this.marker = new google.maps.Marker({ |
290 map: this.map, | 366 map: this.map, |
291 position: { | 367 position: { |
292 lat: parseFloat(this.latitude), | 368 lat: parseFloat(this.latitude), |
293 lng: parseFloat(this.longitude) | 369 lng: parseFloat(this.longitude) |
294 }, | 370 }, |
295 title: this.title, | 371 title: this.title, |
| 372 animation: google.maps.Animation[this.animation], |
296 draggable: this.draggable, | 373 draggable: this.draggable, |
297 visible: !this.hidden, | 374 visible: !this.hidden, |
298 icon: this.icon, | 375 icon: this.icon, |
299 zIndex: this.zIndex | 376 zIndex: this.zIndex |
300 }); | 377 }); |
301 this._contentChanged(); | 378 this._contentChanged(); |
302 this._clickEventsChanged(); | 379 this._clickEventsChanged(); |
303 this._contentChanged(); | 380 this._contentChanged(); |
304 this._mouseEventsChanged(); | 381 this._mouseEventsChanged(); |
| 382 this._openChanged(); |
305 setupDragHandler_.bind(this)(); | 383 setupDragHandler_.bind(this)(); |
306 }, | 384 }, |
307 | 385 |
308 _clearListener: function(name) { | 386 _clearListener: function(name) { |
309 if (this._listeners[name]) { | 387 if (this._listeners[name]) { |
310 google.maps.event.removeListener(this._listeners[name]); | 388 google.maps.event.removeListener(this._listeners[name]); |
311 this._listeners[name] = null; | 389 this._listeners[name] = null; |
312 } | 390 } |
313 }, | 391 }, |
314 | 392 |
(...skipping 17 matching lines...) Expand all Loading... |
332 this.marker.setDraggable(this.draggable); | 410 this.marker.setDraggable(this.draggable); |
333 setupDragHandler_.bind(this)(); | 411 setupDragHandler_.bind(this)(); |
334 break; | 412 break; |
335 case 'title': | 413 case 'title': |
336 this.marker.setTitle(this.title); | 414 this.marker.setTitle(this.title); |
337 break; | 415 break; |
338 } | 416 } |
339 } | 417 } |
340 }); | 418 }); |
341 | 419 |
342 function setupDragHandler_() { | |
343 if (this.draggable) { | |
344 this.dragHandler_ = google.maps.event.addListener( | |
345 this.marker, 'dragend', onDragEnd_.bind(this)); | |
346 } else { | |
347 google.maps.event.removeListener(this.dragHandler_); | |
348 this.dragHandler_ = null; | |
349 } | |
350 } | |
351 | |
352 function onDragEnd_(e, details, sender) { | |
353 this.latitude = e.latLng.lat(); | |
354 this.longitude = e.latLng.lng(); | |
355 } | |
356 })(); | 420 })(); |
357 </script> | 421 </script> |
OLD | NEW |