Package muntjac :: Package addon :: Package google_maps :: Module google_map_app
[hide private]
[frames] | no frames]

Source Code for Module muntjac.addon.google_maps.google_map_app

  1  # Copyright (C) 2012 Vaadin Ltd.  
  2  # Copyright (C) 2012 Richard Lincoln 
  3  #  
  4  # Licensed under the Apache License, Version 2.0 (the "License");  
  5  # you may not use this file except in compliance with the License.  
  6  # You may obtain a copy of the License at  
  7  #  
  8  #     http://www.apache.org/licenses/LICENSE-2.0  
  9  #  
 10  # Unless required by applicable law or agreed to in writing, software  
 11  # distributed under the License is distributed on an "AS IS" BASIS,  
 12  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  
 13  # See the License for the specific language governing permissions and  
 14  # limitations under the License. 
 15   
 16  from random \ 
 17      import random, randint, getrandbits 
 18   
 19  from muntjac.api \ 
 20      import Application, Window, Label, GridLayout, Button 
 21   
 22  from muntjac.ui.button \ 
 23      import IClickListener 
 24   
 25  from muntjac.ui.window \ 
 26      import Notification 
 27   
 28  from muntjac.addon.google_maps.google_map \ 
 29      import GoogleMap, MapControl, IMarkerClickListener, \ 
 30      IMarkerMovedListener, IMapMoveListener 
 31   
 32  from muntjac.addon.google_maps.overlay.basic_marker \ 
 33      import BasicMarker 
 34   
 35  from muntjac.addon.google_maps.overlay.polygon \ 
 36      import Polygon 
 37   
 38   
39 -class GoogleMapWidgetApp(Application):
40
41 - def init(self):
42 # super(GoogleMapWidgetApp, self).__init__() 43 44 self.setMainWindow(Window('Google Map add-on demo')) 45 46 # Create a new map instance centered on the IT Mill offices 47 self._googleMap = GoogleMap(self, (22.3, 60.4522), 8) 48 49 self._googleMap.setWidth('640px') 50 self._googleMap.setHeight('480px') 51 52 # Create a marker at the IT Mill offices 53 self._mark1 = BasicMarker(1L, (22.3, 60.4522), 'Test marker 1') 54 self._mark2 = BasicMarker(2L, (22.4, 60.4522), 'Test marker 2') 55 self._mark3 = BasicMarker(4L, (22.6, 60.4522), 'Test marker 3') 56 self._mark4 = BasicMarker(5L, (22.7, 60.4522), 'Test marker 4') 57 58 l = MarkerClickListener(self) 59 self._googleMap.addListener(l, IMarkerClickListener) 60 61 # Marker with information window pupup 62 self._mark5 = BasicMarker(6L, (22.8, 60.4522), 'Marker 5') 63 self._mark5.setInfoWindowContent(self._googleMap, 64 Label('Hello Marker 5!')) 65 66 content = Label('Hello Marker 2!') 67 content.setWidth('60px') 68 self._mark2.setInfoWindowContent(self._googleMap, content) 69 70 self._googleMap.addMarker(self._mark1) 71 self._googleMap.addMarker(self._mark2) 72 self._googleMap.addMarker(self._mark3) 73 self._googleMap.addMarker(self._mark4) 74 self._googleMap.addMarker(self._mark5) 75 self.getMainWindow().getContent().addComponent(self._googleMap) 76 77 # Add a Marker click listener to catch marker click events. 78 # Note, works only if marker has information window content 79 l = MarkerClickListener2(self) 80 self._googleMap.addListener(l, IMarkerClickListener) 81 82 # Add a MarkerMovedListener to catch events when a marker is dragged to 83 # a new location 84 l = MarkerMovedListener(self) 85 self._googleMap.addListener(l, IMarkerMovedListener) 86 87 l = MapMoveListener(self) 88 self._googleMap.addListener(l, IMapMoveListener) 89 90 self._googleMap.addControl(MapControl.MapTypeControl) 91 92 self.addTestButtons() # Add buttons that trigger tests map features
93 94
95 - def addTestButtons(self):
96 grid = GridLayout(4, 1) 97 grid.setSpacing(True) 98 self.getMainWindow().addComponent(grid) 99 100 l = DraggabilityClickListener(self) 101 grid.addComponent(Button('Toggle marker 3 draggability', l)) 102 103 l = VisibilityClickListener(self) 104 grid.addComponent(Button('Toggle marker 4 visibility', l)) 105 106 l = RandomizeClickListener(self) 107 grid.addComponent(Button('Randomize Marker 5 location', l)) 108 109 l = UpdateClickListener(self) 110 grid.addComponent(Button('Update marker 5 title', l)) 111 112 l = RemoveClickListener(self) 113 grid.addComponent(Button('Remove \"Test marker2\"', l)) 114 115 l = AddClickListener(self) 116 grid.addComponent(Button('Add \"Test marker2\"', l)) 117 118 l = ToggleMarkerClickListener(self) 119 grid.addComponent(Button('Toggle marker 1 icon', l)) 120 121 l = ToggleLoggingClickListener(self) 122 grid.addComponent(Button('Toggle client logging', l)) 123 124 # Popup test 125 l = PopupClickListener(self) 126 grid.addComponent(Button('Open a map in a popup', l)) 127 128 l = ResizeClickListener(self) 129 grid.addComponent(Button('Resize map', l)) 130 131 l = DrawClickListener(self) 132 grid.addComponent(Button('Draw polygon', l)) 133 134 l = RemovePolygonClickListener(self) 135 grid.addComponent(Button('Remove first polygon', l))
136 137
138 -class _MapListener(object):
139
140 - def __init__(self, app):
141 self._app = app
142 143
144 -class MarkerClickListener(_MapListener, IMarkerClickListener):
145
146 - def markerClicked(self, clickedMarker):
147 if (clickedMarker.getIconUrl() is not None 148 and 'green' in clickedMarker.getIconUrl()): 149 clickedMarker.setIconUrl('VAADIN/themes/reindeer/icon/red.png') 150 else: 151 clickedMarker.setIconUrl('VAADIN/themes/reindeer/icon/green.png') 152 self._app._googleMap.requestRepaint()
153 154
155 -class MarkerClickListener2(_MapListener, IMarkerClickListener):
156
157 - def markerClicked(self, clickedMarker):
158 self._app.getMainWindow().showNotification('Marker ' 159 + clickedMarker.getTitle() + ' clicked', 160 Notification.TYPE_TRAY_NOTIFICATION)
161 162
163 -class MarkerMovedListener(_MapListener, IMarkerMovedListener):
164
165 - def markerMoved(self, movedMarker):
166 self._app.getMainWindow().showNotification('Marker ' 167 + movedMarker.getTitle() + ' moved to ' 168 + str(movedMarker.getLatLng()), 169 Notification.TYPE_TRAY_NOTIFICATION)
170 171
172 -class MapMoveListener(_MapListener, IMapMoveListener):
173
174 - def mapMoved(self, newZoomLevel, newCenter, boundsNE, boundsSW):
175 self._app.getMainWindow().showNotification('Zoom ' + str(newZoomLevel) 176 + ' center ' + str(newCenter) + ' bounds ' + str(boundsNE) 177 + '/' + str(boundsSW), Notification.TYPE_TRAY_NOTIFICATION)
178 179
180 -class DraggabilityClickListener(_MapListener, IClickListener):
181
182 - def buttonClick(self, event):
183 self._app._mark3.setDraggable(not self._app._mark3.isDraggable()) 184 self._app._googleMap.requestRepaint()
185 186
187 -class VisibilityClickListener(_MapListener, IClickListener):
188
189 - def buttonClick(self, event):
190 self._app._mark4.setVisible(not self._app._mark4.isVisible()) 191 self._app._googleMap.requestRepaint()
192 193
194 -class RandomizeClickListener(_MapListener, IClickListener):
195
196 - def buttonClick(self, event):
197 self._app._mark5.setLatLng((22.8 + (random() / 10), 198 60.4522 + (random() / 10))) 199 self._app._googleMap.requestRepaint()
200 201
202 -class UpdateClickListener(_MapListener, IClickListener):
203
204 - def buttonClick(self, event):
205 chars = str('.*^"\'') 206 self._app._mark5.setTitle(self._app._mark5.getTitle() 207 + chars[randint(0, len(chars) - 1)]) 208 self._app._googleMap.requestRepaint()
209 210
211 -class RemoveClickListener(_MapListener, IClickListener):
212
213 - def buttonClick(self, event):
214 self._app._googleMap.removeMarker(self._app._mark2)
215 216
217 -class AddClickListener(_MapListener, IClickListener):
218
219 - def buttonClick(self, event):
220 self._app._googleMap.addMarker(self._app._mark2)
221 222
223 -class ToggleMarkerClickListener(_MapListener, IClickListener):
224
225 - def buttonClick(self, event):
226 if self._app._mark1.getIconUrl() is None: 227 self._app._mark1.setIconUrl( 228 'http://bits.ohloh.net/attachments/18966/v_med.gif') 229 self._app._mark1.setIconAnchor(None) 230 elif self._app._mark1.getIconAnchor() is None: 231 self._app._mark1.setIconAnchor((-20, -20)) 232 else: 233 self._app._mark1.setIconUrl(None) 234 self._app._mark1.setIconAnchor(None) 235 self._app._googleMap.requestRepaint()
236 237
238 -class ToggleLoggingClickListener(_MapListener, IClickListener):
239
240 - def buttonClick(self, event):
241 if self._app._googleMap.getClientLogLevel() == 0: 242 self._app._googleMap.setClientLogLevel(1) 243 self._app.getMainWindow().showNotification( 244 'Client logging enabled', 245 Notification.TYPE_TRAY_NOTIFICATION) 246 else: 247 self._app._googleMap.setClientLogLevel(0) 248 self._app.getMainWindow().showNotification( 249 'Client logging disabled', 250 Notification.TYPE_TRAY_NOTIFICATION)
251 252
253 -class PopupClickListener(_MapListener, IClickListener):
254
255 - def buttonClick(self, event):
256 app = self._app#event.getButton().getApplication() 257 258 map2 = GoogleMap(app, (22.3, 60.4522), 8) 259 map2.setHeight('240px') 260 map2.setWidth('240px') 261 262 w = Window('popup') 263 w.addComponent(map2) 264 w.setHeight('300px') 265 w.setWidth('300px') 266 app.getMainWindow().addWindow(w)
267 268
269 -class ResizeClickListener(_MapListener, IClickListener):
270
271 - def buttonClick(self, event):
272 if self._app._googleMap.getHeight() == 200: 273 self._app._googleMap.setWidth('640px') 274 self._app._googleMap.setHeight('480px') 275 else: 276 self._app._googleMap.setHeight('200px') 277 self._app._googleMap.setWidth('200px')
278 279
280 -class DrawClickListener(_MapListener, IClickListener):
281
282 - def buttonClick(self, event):
283 # Location of Vaadin Ltd offices 284 c = (22.3, 60.4522) 285 delta = 0.75 286 corners = [(c[0] - delta, c[1] + delta), (c[0] + delta, c[1] + delta), 287 (c[0] + delta, c[1] - delta), (c[0] - delta, c[1] - delta), 288 (c[0] - delta, c[1] + delta)] 289 poly = Polygon(getrandbits(48), corners, '#f04040', 5, 0.8, 290 '#1010ff', 0.2, False) 291 self._app._googleMap.addPolyOverlay(poly)
292 293
294 -class RemovePolygonClickListener(_MapListener, IClickListener):
295
296 - def buttonClick(self, event):
297 overlays = self._app._googleMap.getOverlays() 298 if len(overlays) > 0: 299 self._app._googleMap.removeOverlay(overlays[-1]) 300 self._app.getMainWindow().showNotification('Overlay removed', 301 Notification.TYPE_TRAY_NOTIFICATION) 302 else: 303 self._app.getMainWindow().showNotification('No overlays to remove', 304 Notification.TYPE_TRAY_NOTIFICATION)
305 306 307 if __name__ == '__main__': 308 from muntjac.main import muntjac 309 muntjac(GoogleMapWidgetApp, nogui=True, forever=True, debug=True) 310