/* * * ============================================================================== * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package wicket.contrib.gmap3.overlay; import org.apache.wicket.Session; import org.apache.wicket.ajax.AjaxRequestTarget; import wicket.contrib.gmap3.GMap; import wicket.contrib.gmap3.ReviewPending; import java.io.Serializable; import java.util.Collections; import java.util.EnumMap; import java.util.Map; /** * Represents an Google Maps API's <a href= "http://www.google.com/apis/maps/documentation/reference.html#GOverlay" * >GOverlay</a>. */ @ReviewPending // Remove if class is tested. public abstract class GOverlay implements Serializable { private static final long serialVersionUID = 1L; /** * id of this object. it is session unique. */ private final String _id; private GMap _parent = null; private final Map<GOverlayEvent, GOverlayEventHandler> events = new EnumMap<GOverlayEvent, GOverlayEventHandler>( GOverlayEvent.class); private final Map<GOverlayEvent, String> _functions = new EnumMap<GOverlayEvent, String>(GOverlayEvent.class); /** * Construct. */ public GOverlay() { // id is session unique _id = String.valueOf(Session.get().nextSequenceValue()); } public String getJsReference() { return _parent.getJsReference() + ".overlays['" + getId() + "']"; } /** * @return String representing the JavaScript add command for the corresponding JavaScript object. */ public String getJS() { return addFunctions(addEvents(addOverlays(new StringBuffer()))).toString(); } private StringBuffer addOverlays(final StringBuffer js) { js.append("var overlay" + getId() + " = " + getJSconstructor() + ";\n"); // Overlays will set map in their options, so this is not necessary js.append("overlay" + getId() + ".setMap(" + _parent.getJsReference() + ".map);\n"); js.append(_parent.getJSinvoke("addOverlay('" + getId() + "', overlay" + getId() + ")")); return js; } private StringBuffer addFunctions(final StringBuffer js) { for (final GOverlayEvent event : _functions.keySet()) { js.append(event.getJSadd(this, _functions.get(event))); } return js; } private StringBuffer addEvents(final StringBuffer js) { for (final GOverlayEvent event : events.keySet()) { js.append(event.getJSadd(this)); } return js; } /** * @return String representing the JavaScript remove command for the corresponding JavaScript object. */ public String getJSremove() { final StringBuffer js = new StringBuffer(); // clear the Events for (final GOverlayEvent event : events.keySet()) { js.append(event.getJSclear(this)); } js.append(_parent.getJSinvoke("removeOverlay('" + getId() + "')")); return js.toString(); } /** * @return The session unique id of this object as a String. */ public String getId() { return _id; } /** * Implement the needed JavaScript constructor for the corresponding JavaScript object. * * @return String representing the JavaScript constructor. */ public abstract String getJSconstructor(); public GMap getParent() { return _parent; } public void setParent(final GMap parent) { _parent = parent; } /** * Add a control. * * @param control control to add * @return This */ public GOverlay addListener(final GOverlayEvent event, final GOverlayEventHandler handler) { events.put(event, handler); return this; } /** * Add a control. * * @param control control to add * @return This */ public GOverlay addListener(final GOverlayEvent event, final GOverlayEventHandler handler, final AjaxRequestTarget target) { addListener(event, handler); target.appendJavaScript(event.getJSadd(this)); return this; } /** * Add a none Ajax Event. */ public GOverlay addFunctionListener(final GOverlayEvent event, final String jsFunction) { _functions.put(event, jsFunction); return this; } /** * Return all registered Listeners. * * @return registered listeners */ public Map<GOverlayEvent, GOverlayEventHandler> getListeners() { return Collections.unmodifiableMap(events); } /** * Return all registered Listeners. * * @return registered listeners */ public Map<GOverlayEvent, String> getFunctionListeners() { return Collections.unmodifiableMap(_functions); } /** * Clear listeners. * * @param event event to be cleared. * @return This */ public GOverlay clearListeners(final GOverlayEvent event) { events.remove(event); return this; } /** * Clear listeners. * * @param event event to be cleared. * @return This */ public GOverlay clearListeners(final GOverlayEvent event, final AjaxRequestTarget target) { clearListeners(event); target.appendJavaScript(event.getJSclear(this)); return this; } /** * Called when an Ajax call occurs. * * @param target * @param overlayEvent */ public void onEvent(final AjaxRequestTarget target, final GOverlayEvent overlayEvent) { updateOnAjaxCall(target, overlayEvent); events.get(overlayEvent).onEvent(target); } /** * Implement to handle Ajax calls to your needs. * * @param target * @param overlayEvent */ protected abstract void updateOnAjaxCall(AjaxRequestTarget target, GOverlayEvent overlayEvent); }