001 package com.google.gwt.maps.client.events; 002 003 import com.google.gwt.ajaxloader.client.ArrayHelper; 004 import com.google.gwt.ajaxloader.client.Properties; 005 import com.google.gwt.core.client.GWT; 006 import com.google.gwt.core.client.JavaScriptObject; 007 import com.google.gwt.core.client.JsArray; 008 import com.google.gwt.event.dom.client.ClickHandler; 009 import com.google.gwt.event.shared.HandlerRegistration; 010 import com.google.gwt.maps.client.MapWidget; 011 import com.google.gwt.maps.client.events.mapchange.MapChangeEventFormatter; 012 013 public class MapHandlerRegistration { 014 015 /** 016 * event handler 017 * 018 * @param jso 019 * @param eventType 020 * @param handler 021 * @param formatter 022 */ 023 public static <E extends MapEvent> HandlerRegistration addHandler( 024 JavaScriptObject jso, MapEventType eventType, 025 MapHandler<E> handler, MapEventFormatter<E> formatter) { 026 final JavaScriptObject listener = addHandlerImpl(jso, 027 eventType.value(), handler, formatter); 028 HandlerRegistration registration = new HandlerRegistration() { 029 @Override 030 public void removeHandler() { 031 removeHandlerImpl(listener); 032 } 033 }; 034 return registration; 035 } 036 037 /** 038 * event handler for the mvc object 039 * 040 * @param jso 041 * @param eventType 042 * @param handler 043 * @param formatter 044 */ 045 public static <E extends MapEvent> HandlerRegistration addHandlerMvc( 046 JavaScriptObject jso, MapEventType eventType, 047 MapHandler<E> handler, MapEventFormatter<E> formatter) { 048 final JavaScriptObject listener = addHandlerImplMvc(jso, 049 eventType.value(), handler, formatter); 050 HandlerRegistration registration = new HandlerRegistration() { 051 @Override 052 public void removeHandler() { 053 removeHandlerImpl(listener); 054 } 055 }; 056 return registration; 057 } 058 059 /** 060 * event handler for the drawing overlay objects 061 * 062 * @param jso 063 * @param eventType 064 * @param handler 065 * @param formatter 066 */ 067 public static <E extends MapEvent> HandlerRegistration addHandlerDrawing( 068 JavaScriptObject jso, MapEventType eventType, 069 MapHandler<E> handler, MapEventFormatter<E> formatter) { 070 071 final JavaScriptObject listener = addHandlerImplDrawing(jso, 072 eventType.value(), handler, formatter); 073 HandlerRegistration registration = new HandlerRegistration() { 074 @Override 075 public void removeHandler() { 076 removeHandlerImpl(listener); 077 } 078 }; 079 return registration; 080 } 081 082 /** 083 * process the callback and send it to the handler 084 * 085 * @param jso 086 * @param eventName 087 * @param handler 088 * @param formatter 089 */ 090 private static native <E extends MapEvent> JavaScriptObject addHandlerImpl( 091 JavaScriptObject jso, String eventName, MapHandler<E> handler, 092 MapEventFormatter<E> formatter) /*-{ 093 var callback = function(event) { 094 @com.google.gwt.maps.client.events.MapHandlerRegistration::onCallback(Lcom/google/gwt/maps/client/events/MapHandler;Lcom/google/gwt/ajaxloader/client/Properties;Lcom/google/gwt/maps/client/events/MapEventFormatter;)(handler, event, formatter); 095 }; 096 return $wnd.google.maps.event.addListener(jso, eventName, callback) 097 }-*/; 098 099 /** 100 * process the callback and send it to the handler 101 * 102 * @param jso 103 * @param eventName 104 * @param handler 105 * @param formatter 106 */ 107 private static native <E extends MapEvent> JavaScriptObject addHandlerImplMvc( 108 JavaScriptObject jso, String eventName, MapHandler<E> handler, 109 MapEventFormatter<E> formatter) /*-{ 110 var callback = function(event) { 111 var eventCon = { 112 index : event 113 }; 114 @com.google.gwt.maps.client.events.MapHandlerRegistration::onCallback(Lcom/google/gwt/maps/client/events/MapHandler;Lcom/google/gwt/ajaxloader/client/Properties;Lcom/google/gwt/maps/client/events/MapEventFormatter;)(handler, eventCon, formatter); 115 }; 116 return $wnd.google.maps.event.addListener(jso, eventName, callback) 117 }-*/; 118 119 /** 120 * drawing sends events partly with different signature or arguments. 121 * 122 * @param jso 123 * @param eventName 124 * @param handler 125 * @param formatter 126 */ 127 private static native <E extends MapEvent> JavaScriptObject addHandlerImplDrawing( 128 JavaScriptObject jso, String eventName, MapHandler<E> handler, 129 MapEventFormatter<E> formatter) /*-{ 130 var callback = function(event) { 131 var eventCon = { 132 overlay : event 133 }; 134 @com.google.gwt.maps.client.events.MapHandlerRegistration::onCallback(Lcom/google/gwt/maps/client/events/MapHandler;Lcom/google/gwt/ajaxloader/client/Properties;Lcom/google/gwt/maps/client/events/MapEventFormatter;)(handler, eventCon, formatter); 135 }; 136 return $wnd.google.maps.event.addListener(jso, eventName, callback) 137 }-*/; 138 139 /** 140 * HandlerRegistration call when finished 141 * 142 * @param listener 143 */ 144 private static native void removeHandlerImpl(JavaScriptObject listener) /*-{ 145 $wnd.google.maps.MapsEventListener.addListener(listener); 146 }-*/; 147 148 /** 149 * process generic handler callback 150 * 151 * @param handler 152 * @param properties 153 * @param formatter 154 */ 155 protected static <E extends MapEvent> void onCallback( 156 final MapHandler<E> handler, final Properties properties, 157 final MapEventFormatter<E> formatter) { 158 try { 159 formatEvent(handler, properties, formatter); 160 } catch (Throwable x) { 161 GWT.getUncaughtExceptionHandler().onUncaughtException(x); 162 } 163 } 164 165 /** 166 * create a map event 167 * 168 * @param handler 169 * @param properties 170 * @param formatter 171 */ 172 private static <E extends MapEvent> void formatEvent(MapHandler<E> handler, 173 Properties properties, MapEventFormatter<E> formatter) { 174 E event = formatter.createEvent(properties); 175 handler.onEvent(event); 176 } 177 178 /** 179 * Triggers the given event. All arguments after eventName are passed as 180 * arguments to the listeners. <br> 181 * <b>Note:</b> Use Marker in objects to click on. 182 * 183 * @param w 184 * @param eventType 185 * @param objects 186 */ 187 public static void trigger(MapWidget w, MapEventType eventType, 188 JavaScriptObject... objects) { 189 JsArray<JavaScriptObject> a = ArrayHelper.toJsArray(objects); 190 triggerImpl(w, eventType.value(), a); 191 } 192 193 private static native void triggerImpl(MapWidget w, String eventName, 194 JsArray<JavaScriptObject> args) /*-{ 195 var jso = w.@com.google.gwt.maps.client.MapWidget::getJso()(); 196 $wnd.google.maps.event.trigger(jso, eventName, args); 197 }-*/; 198 199 /** 200 * Triggers the given event. All arguments after eventName are passed as 201 * arguments to the listeners. <br> 202 * <b>Note:</b> Use Marker in objects to click on. 203 * 204 * @param w 205 * @param eventType 206 */ 207 public static void trigger(MapWidget w, MapEventType eventType) { 208 triggerImpl(w, eventType.value()); 209 } 210 211 private static native void triggerImpl(MapWidget w, String eventName) /*-{ 212 var jso = w.@com.google.gwt.maps.client.MapWidget::getJso()(); 213 $wnd.google.maps.event.trigger(jso, eventName); 214 }-*/; 215 216 /** 217 * experimental for the moment. I'm not satisfied as of yet with this 218 * strategy. 219 * 220 * Cross browser event handler registration. This listener is removed by 221 * calling removeListener(handle) for the handle that is returned by this 222 * function. 223 * 224 * @param jso 225 * @param type 226 * @param handler 227 * @param capture 228 */ 229 public static <E> void addDomListener(JavaScriptObject jso, 230 com.google.gwt.event.dom.client.DomEvent.Type<ClickHandler> type, 231 MapHandler<E> handler, boolean capture) { 232 addDomListener(jso, type.getName(), handler, capture); 233 } 234 235 private static native <E> void addDomListener(JavaScriptObject object, 236 String eventName, MapHandler<?> handler, boolean capture) /*-{ 237 var callback = function(event) { 238 @com.google.gwt.maps.client.events.MapHandlerRegistration::addDomListenerImpl(Lcom/google/gwt/ajaxloader/client/Properties;Lcom/google/gwt/maps/client/events/MapHandler;)(event, handler) 239 }; 240 $wnd.google.maps.event.addDomListener(object, eventName, callback, 241 capture); 242 }-*/; 243 244 private static void addDomListenerImpl(Properties properties, 245 MapHandler<MapEvent> handler) { 246 MapChangeEventFormatter formatter = new MapChangeEventFormatter(); 247 handler.onEvent(formatter.createEvent(properties)); 248 } 249 250 }